From 099103ad768d919d739442b34b896ed6790b3307 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sun, 26 Feb 2017 00:56:07 -0500 Subject: [PATCH 01/26] + Base raymarching code with primitives. --- src/glsl/pass-vert.glsl | 5 ++ src/glsl/rayMarch-frag.glsl | 127 ++++++++++++++++++++++++++++++++++-- src/main.js | 7 +- src/rayMarching.js | 25 ++++++- 4 files changed, 154 insertions(+), 10 deletions(-) diff --git a/src/glsl/pass-vert.glsl b/src/glsl/pass-vert.glsl index 748eb5c..256bc64 100644 --- a/src/glsl/pass-vert.glsl +++ b/src/glsl/pass-vert.glsl @@ -1,5 +1,10 @@ varying vec2 f_uv; +varying vec4 f_ndcP; + void main() { + vec2 tmp = vec2(uv.x, uv.y); + tmp = (tmp * 2.0) - vec2(1.0); + f_ndcP = vec4(tmp, 1.0, 1.0) * 1000.0; f_uv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } \ No newline at end of file diff --git a/src/glsl/rayMarch-frag.glsl b/src/glsl/rayMarch-frag.glsl index 7c01941..a40fafc 100644 --- a/src/glsl/rayMarch-frag.glsl +++ b/src/glsl/rayMarch-frag.glsl @@ -1,5 +1,7 @@ - #define MAX_GEOMETRY_COUNT 100 +#define FAR_CLIP 1000.0 +#define MAX_ITERATIONS 64 +#define EPSILON 0.01 /* This is how I'm packing the data struct geometry_t { @@ -7,18 +9,129 @@ struct geometry_t { float type; }; */ + +struct Ray { + vec3 position; + vec3 direction; +}; + +uniform mat4 u_viewProjectionMatrix; +uniform vec3 u_cameraPosition; + uniform vec4 u_buffer[MAX_GEOMETRY_COUNT]; uniform int u_count; +uniform float u_debug; + varying vec2 f_uv; +varying vec4 f_ndcP; + +// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm +vec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d) +{ + return saturate(a + b * cos(6.28318 * ( c * t + d))); +} + +vec3 debugIterations(float factor) +{ + vec3 a = vec3(0.478, 0.500, 0.500); + vec3 b = vec3(0.500); + vec3 c = vec3(0.688, 0.748, 0.748); + vec3 d = vec3(0.318, 0.588, 0.908); + + return palette(factor, a, b, c, d); +} + +// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm +float sdSphere( vec3 p, float s ) +{ + return length(p) - s; +} + +float udBox( vec3 p, vec3 b ) +{ + return length(max(abs(p) - b, 0.0)); +} + +float udRoundBox( vec3 p, vec3 b, float r ) +{ + return length(max(abs(p) - b, 0.0)) - r; +} + +float sdCappedCone( in vec3 p, in vec3 c ) +{ + p.y -= .25; + vec2 q = vec2( length(p.xz), p.y ); + vec2 v = vec2( c.z*c.y/c.x, -c.z ); + vec2 w = v - q; + vec2 vv = vec2( dot(v,v), v.x*v.x ); + vec2 qv = vec2( dot(v,w), v.x*w.x ); + vec2 d = max(qv,0.0)*qv/vv; + return sqrt( dot(w,w) - max(d.x,d.y) ) * sign(max(q.y*v.x-q.x*v.y,w.y)); +} -void main() { - float t; - for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) { - if (i >= u_count) { +Ray getRay() +{ + Ray ray; + ray.position = u_cameraPosition; + ray.direction = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - ray.position); + return ray; +} + +// Assumes minDistance was initialized to FAR_CLIP +void evaluateSceneDistanceFunction(vec3 currentPosition, out float minDistance) +{ + for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) + { + if (i >= u_count) break; - } + + vec4 geo = u_buffer[i]; + + float d = FAR_CLIP; + + if(geo.w == 0.0) + d = udBox(currentPosition - geo.xyz, vec3(.5)); + else if(geo.w == 1.0) + d = sdSphere(currentPosition - geo.xyz, 1.0); + else if(geo.w == 2.0) + d = sdCappedCone((currentPosition - geo.xyz) * .5, normalize(vec3(1.0))); + + if(d < minDistance) + minDistance = d; } +} + +void main() +{ + Ray ray = getRay(); + + vec3 color; + vec3 current = ray.position; + float t = 0.0; + float iterationCount = 0.0; + + for(int j = 0; j < MAX_ITERATIONS; j++) + { + float d = FAR_CLIP; + evaluateSceneDistanceFunction(current, d); + + if(d < EPSILON) + { + color = vec3(t); + break; + } + + t += d; + current += ray.direction * d; + iterationCount += 1.0; + + if(t >= FAR_CLIP) + break; + } + + vec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS)); + color = mix(color, debugColor, u_debug); - gl_FragColor = vec4(f_uv, 0, 1); + gl_FragColor = vec4(color, 1.0); } \ No newline at end of file diff --git a/src/main.js b/src/main.js index ade21ee..14c4539 100644 --- a/src/main.js +++ b/src/main.js @@ -44,10 +44,12 @@ window.addEventListener('load', function() { var gui = new DAT.GUI(); var options = { - strategy: 'Proxy Geometry' + strategy: 'Ray Marching', + debug : false } gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching']); + gui.add(options, 'debug'); scene.add(new THREE.AxisHelper(20)); scene.add(new THREE.DirectionalLight(0xffffff, 1)); @@ -77,10 +79,11 @@ window.addEventListener('load', function() { controls.update(); stats.begin(); proxyGeometry.update(); + if (options.strategy === 'Proxy Geometry') { renderer.render(scene, camera); } else if (options.strategy === 'Ray Marching') { - rayMarcher.render(proxyGeometry.buffer); + rayMarcher.render(proxyGeometry.buffer, camera, options); } stats.end(); requestAnimationFrame(tick); diff --git a/src/rayMarching.js b/src/rayMarching.js index 03c3680..c5c8d0b 100644 --- a/src/rayMarching.js +++ b/src/rayMarching.js @@ -15,6 +15,18 @@ export default function RayMarcher(renderer, scene, camera) { type: 'i', value: 0 }, + u_debug: { + type: 'f', + value: 0 + }, + u_viewProjectionMatrix : { + type: 'm4', + value: new THREE.Matrix4() + }, + u_cameraPosition : { + type: 'v3', + value: new THREE.Vector3(0,0,0) + } }, vertexShader: require('./glsl/pass-vert.glsl'), fragmentShader: require('./glsl/rayMarch-frag.glsl') @@ -22,10 +34,21 @@ export default function RayMarcher(renderer, scene, camera) { shaderPass.renderToScreen = true; composer.addPass(shaderPass); + var inverseProjectionMatrix = new THREE.Matrix4(); + return { - render: function(buffer) { + render: function(buffer, camera, options) { + shaderPass.material.uniforms.u_buffer.value = buffer; shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE; + shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + + camera.updateMatrix(); + camera.updateProjectionMatrix(); + + inverseProjectionMatrix.getInverse(camera.projectionMatrix); + shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); + shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); composer.render(); } From 49afff9bc62288097714859621235900f2f97e23 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sun, 26 Feb 2017 01:41:26 -0500 Subject: [PATCH 02/26] + Basic diffuse shading with shadows, plus gamma correction and some fixes. --- src/glsl/rayMarch-frag.glsl | 122 +++++++++++++++++++++++++++++++----- src/main.js | 6 ++ src/proxy_geometry.js | 2 + 3 files changed, 115 insertions(+), 15 deletions(-) diff --git a/src/glsl/rayMarch-frag.glsl b/src/glsl/rayMarch-frag.glsl index a40fafc..5c49653 100644 --- a/src/glsl/rayMarch-frag.glsl +++ b/src/glsl/rayMarch-frag.glsl @@ -1,7 +1,8 @@ #define MAX_GEOMETRY_COUNT 100 #define FAR_CLIP 1000.0 -#define MAX_ITERATIONS 64 -#define EPSILON 0.01 +#define SHADOW_ITERATIONS 64 +#define MAX_ITERATIONS 100 +#define EPSILON 0.005 /* This is how I'm packing the data struct geometry_t { @@ -53,6 +54,12 @@ float udBox( vec3 p, vec3 b ) return length(max(abs(p) - b, 0.0)); } +float sdPlane( vec3 p, vec4 n ) +{ + // n must be normalized + return dot(p,n.xyz) + n.w; +} + float udRoundBox( vec3 p, vec3 b, float r ) { return length(max(abs(p) - b, 0.0)) - r; @@ -78,30 +85,104 @@ Ray getRay() return ray; } -// Assumes minDistance was initialized to FAR_CLIP -void evaluateSceneDistanceFunction(vec3 currentPosition, out float minDistance) -{ - for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) +float evaluateGeometrySDF(vec3 point, vec4 geo) +{ + vec3 localPoint = point - geo.xyz; + + if(geo.w == 0.0) + return udBox(localPoint, vec3(.5)); + else if(geo.w == 1.0) + return sdSphere(localPoint, 1.0); + else if(geo.w == 2.0) + return sdCappedCone(localPoint * .5, normalize(vec3(1.0))); + else if(geo.w == 3.0) + return sdPlane(localPoint, vec4(0.0, 1.0, 0.0, 0.0)); + + return FAR_CLIP; +} + +// This method is useful for just the distance +float evaluateSceneSDFSimple(vec3 point) +{ + float minDistance = FAR_CLIP; + + for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) { if (i >= u_count) break; vec4 geo = u_buffer[i]; + float d = evaluateGeometrySDF(point, geo); + + if(d < minDistance) + minDistance = d; + } - float d = FAR_CLIP; + return minDistance; +} - if(geo.w == 0.0) - d = udBox(currentPosition - geo.xyz, vec3(.5)); - else if(geo.w == 1.0) - d = sdSphere(currentPosition - geo.xyz, 1.0); - else if(geo.w == 2.0) - d = sdCappedCone((currentPosition - geo.xyz) * .5, normalize(vec3(1.0))); +// Assumes minDistance was initialized to FAR_CLIP +void evaluateSceneSDF(vec3 point, out float minDistance) +{ + minDistance = FAR_CLIP; + + for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) + { + if (i >= u_count) + break; + vec4 geo = u_buffer[i]; + float d = evaluateGeometrySDF(point, geo); + if(d < minDistance) minDistance = d; } } +vec3 estimateSceneGradient(vec3 point, float epsilon) +{ + float x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z)); + x -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z)); + + float y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z)); + y -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z)); + + float z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon)); + z -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon)); + + return normalize(vec3(x,y,z)); +} + + +float evaluateShadows(vec3 point, vec3 light) +{ + Ray ray; + ray.position = point; + ray.direction = (light - point); + + float maxDistance = length(ray.direction); + ray.direction = normalize(ray.direction); + + float t = 0.0; + vec3 current = ray.position; + + for(int i = 0; i < SHADOW_ITERATIONS; i++) + { + float d = evaluateSceneSDFSimple(current); + + if(d < EPSILON) + break; + + t += d; + current += ray.direction * d; + + if(t > maxDistance) + break; + } + + return 1.0 - smoothstep(t, t + .5, maxDistance); +} + void main() { Ray ray = getRay(); @@ -114,11 +195,20 @@ void main() for(int j = 0; j < MAX_ITERATIONS; j++) { float d = FAR_CLIP; - evaluateSceneDistanceFunction(current, d); + evaluateSceneSDF(current, d); if(d < EPSILON) { - color = vec3(t); + vec3 normal = estimateSceneGradient(current, EPSILON); + + vec3 light = vec3(0.0, 4.0, 3.0); + vec3 l = light - current; + + float falloff = 15.0 / pow(length(l) + EPSILON, 2.0); + float diffuse = clamp(dot(normal, normalize(l)) * falloff, 0.0, 1.0); + float shadow = evaluateShadows(current + normal * .05, light); + + color = vec3(diffuse * shadow); break; } @@ -130,6 +220,8 @@ void main() break; } + color = pow(color, vec3(.45454)); + vec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS)); color = mix(color, debugColor, u_debug); diff --git a/src/main.js b/src/main.js index 14c4539..8bfaca4 100644 --- a/src/main.js +++ b/src/main.js @@ -11,6 +11,7 @@ import RayMarcher from './rayMarching' var BoxGeometry = new THREE.BoxGeometry(1, 1, 1); var SphereGeometry = new THREE.SphereGeometry(1, 32, 32); var ConeGeometry = new THREE.ConeGeometry(1, 1); +var PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 ); window.addEventListener('load', function() { var stats = new Stats(); @@ -59,13 +60,18 @@ window.addEventListener('load', function() { var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial); var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial); var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial); + var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial); + + planeMesh.rotateX(Math.PI * -.5); + planeMesh.position.set(0, -1, 0); boxMesh.position.set(-3, 0, 0); coneMesh.position.set(3, 0, 0); proxyGeometry.add(boxMesh); proxyGeometry.add(sphereMesh); proxyGeometry.add(coneMesh); + proxyGeometry.add(planeMesh); scene.add(proxyGeometry.group); diff --git a/src/proxy_geometry.js b/src/proxy_geometry.js index c100b82..914a094 100644 --- a/src/proxy_geometry.js +++ b/src/proxy_geometry.js @@ -47,6 +47,8 @@ export default class ProxyGeometry { this._buffer[PROXY_BUFFER_SIZE*i+3] = 1; } else if (child.geometry instanceof THREE.ConeGeometry) { this._buffer[PROXY_BUFFER_SIZE*i+3] = 2; + } else if (child.geometry instanceof THREE.PlaneGeometry) { + this._buffer[PROXY_BUFFER_SIZE*i+3] = 3; } } } From a459cef78997df5a712d29554eb4dc08925838f0 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sun, 26 Feb 2017 01:45:28 -0500 Subject: [PATCH 03/26] + Build files --- build/bundle.js | 49532 ++++++++++++++++++++++++++++++++++++++++++ build/bundle.js.map | 1 + build/index.html | 19 + 3 files changed, 49552 insertions(+) create mode 100644 build/bundle.js create mode 100644 build/bundle.js.map create mode 100644 build/index.html diff --git a/build/bundle.js b/build/bundle.js new file mode 100644 index 0000000..746552e --- /dev/null +++ b/build/bundle.js @@ -0,0 +1,49532 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _datGui = __webpack_require__(1); + + var _datGui2 = _interopRequireDefault(_datGui); + + var _statsJs = __webpack_require__(4); + + var _statsJs2 = _interopRequireDefault(_statsJs); + + var _proxy_geometry = __webpack_require__(5); + + var _proxy_geometry2 = _interopRequireDefault(_proxy_geometry); + + var _rayMarching = __webpack_require__(7); + + var _rayMarching2 = _interopRequireDefault(_rayMarching); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + __webpack_require__(16); + + var THREE = __webpack_require__(6); + var OrbitControls = __webpack_require__(17)(THREE); + + var BoxGeometry = new THREE.BoxGeometry(1, 1, 1); + var SphereGeometry = new THREE.SphereGeometry(1, 32, 32); + var ConeGeometry = new THREE.ConeGeometry(1, 1); + var PlaneGeometry = new THREE.PlaneGeometry(100, 100, 1, 1); + + window.addEventListener('load', function () { + var stats = new _statsJs2.default(); + stats.setMode(1); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); + + var scene = new THREE.Scene(); + var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); + var renderer = new THREE.WebGLRenderer({ antialias: true }); + renderer.setPixelRatio(window.devicePixelRatio); + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.setClearColor(0x999999, 1.0); + document.body.appendChild(renderer.domElement); + + var controls = new OrbitControls(camera, renderer.domElement); + controls.enableDamping = true; + controls.enableZoom = true; + controls.rotateSpeed = 0.3; + controls.zoomSpeed = 1.0; + controls.panSpeed = 2.0; + + window.addEventListener('resize', function () { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize(window.innerWidth, window.innerHeight); + }); + + var gui = new _datGui2.default.GUI(); + + var options = { + strategy: 'Ray Marching', + debug: false + }; + + gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching']); + gui.add(options, 'debug'); + + scene.add(new THREE.AxisHelper(20)); + scene.add(new THREE.DirectionalLight(0xffffff, 1)); + + var proxyGeometry = new _proxy_geometry2.default(); + + var boxMesh = new THREE.Mesh(BoxGeometry, _proxy_geometry.ProxyMaterial); + var sphereMesh = new THREE.Mesh(SphereGeometry, _proxy_geometry.ProxyMaterial); + var coneMesh = new THREE.Mesh(ConeGeometry, _proxy_geometry.ProxyMaterial); + var planeMesh = new THREE.Mesh(PlaneGeometry, _proxy_geometry.ProxyMaterial); + + planeMesh.rotateX(Math.PI * -.5); + planeMesh.position.set(0, -1, 0); + boxMesh.position.set(-3, 0, 0); + coneMesh.position.set(3, 0, 0); + + proxyGeometry.add(boxMesh); + proxyGeometry.add(sphereMesh); + proxyGeometry.add(coneMesh); + proxyGeometry.add(planeMesh); + + scene.add(proxyGeometry.group); + + camera.position.set(5, 10, 15); + camera.lookAt(new THREE.Vector3(0, 0, 0)); + controls.target.set(0, 0, 0); + + var rayMarcher = new _rayMarching2.default(renderer, scene, camera); + + (function tick() { + controls.update(); + stats.begin(); + proxyGeometry.update(); + + if (options.strategy === 'Proxy Geometry') { + renderer.render(scene, camera); + } else if (options.strategy === 'Ray Marching') { + rayMarcher.render(proxyGeometry.buffer, camera, options); + } + stats.end(); + requestAnimationFrame(tick); + })(); + }); + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(2) + module.exports.color = __webpack_require__(3) + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + /** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + /** @namespace */ + var dat = module.exports = dat || {}; + + /** @namespace */ + dat.gui = dat.gui || {}; + + /** @namespace */ + dat.utils = dat.utils || {}; + + /** @namespace */ + dat.controllers = dat.controllers || {}; + + /** @namespace */ + dat.dom = dat.dom || {}; + + /** @namespace */ + dat.color = dat.color || {}; + + dat.utils.css = (function () { + return { + load: function (url, doc) { + doc = doc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function(css, doc) { + doc = doc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = css; + doc.getElementsByTagName('head')[0].appendChild(injected); + } + } + })(); + + + dat.utils.common = (function () { + + var ARR_EACH = Array.prototype.forEach; + var ARR_SLICE = Array.prototype.slice; + + /** + * Band-aid methods for things that should be a lot easier in JavaScript. + * Implementation and structure inspired by underscore.js + * http://documentcloud.github.com/underscore/ + */ + + return { + + BREAK: {}, + + extend: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (!this.isUndefined(obj[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + defaults: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (this.isUndefined(target[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + compose: function() { + var toCall = ARR_SLICE.call(arguments); + return function() { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length -1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + } + }, + + each: function(obj, itr, scope) { + + + if (ARR_EACH && obj.forEach === ARR_EACH) { + + obj.forEach(itr, scope); + + } else if (obj.length === obj.length + 0) { // Is number but not NaN + + for (var key = 0, l = obj.length; key < l; key++) + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) + return; + + } else { + + for (var key in obj) + if (itr.call(scope, obj[key], key) === this.BREAK) + return; + + } + + }, + + defer: function(fnc) { + setTimeout(fnc, 0); + }, + + toArray: function(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + + isUndefined: function(obj) { + return obj === undefined; + }, + + isNull: function(obj) { + return obj === null; + }, + + isNaN: function(obj) { + return obj !== obj; + }, + + isArray: Array.isArray || function(obj) { + return obj.constructor === Array; + }, + + isObject: function(obj) { + return obj === Object(obj); + }, + + isNumber: function(obj) { + return obj === obj+0; + }, + + isString: function(obj) { + return obj === obj+''; + }, + + isBoolean: function(obj) { + return obj === false || obj === true; + }, + + isFunction: function(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } + + }; + + })(); + + + dat.controllers.Controller = (function (common) { + + /** + * @class An "abstract" class that represents a given property of an object. + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var Controller = function(object, property) { + + this.initialValue = object[property]; + + /** + * Those who extend this class will put their DOM elements in here. + * @type {DOMElement} + */ + this.domElement = document.createElement('div'); + + /** + * The object to manipulate + * @type {Object} + */ + this.object = object; + + /** + * The name of the property to manipulate + * @type {String} + */ + this.property = property; + + /** + * The function to be called on change. + * @type {Function} + * @ignore + */ + this.__onChange = undefined; + + /** + * The function to be called on finishing change. + * @type {Function} + * @ignore + */ + this.__onFinishChange = undefined; + + }; + + common.extend( + + Controller.prototype, + + /** @lends dat.controllers.Controller.prototype */ + { + + /** + * Specify that a function fire every time someone changes the value with + * this Controller. + * + * @param {Function} fnc This function will be called whenever the value + * is modified via this Controller. + * @returns {dat.controllers.Controller} this + */ + onChange: function(fnc) { + this.__onChange = fnc; + return this; + }, + + /** + * Specify that a function fire every time someone "finishes" changing + * the value wih this Controller. Useful for values that change + * incrementally like numbers or strings. + * + * @param {Function} fnc This function will be called whenever + * someone "finishes" changing the value via this Controller. + * @returns {dat.controllers.Controller} this + */ + onFinishChange: function(fnc) { + this.__onFinishChange = fnc; + return this; + }, + + /** + * Change the value of object[property] + * + * @param {Object} newValue The new value of object[property] + */ + setValue: function(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + }, + + /** + * Gets the value of object[property] + * + * @returns {Object} The current value of object[property] + */ + getValue: function() { + return this.object[this.property]; + }, + + /** + * Refreshes the visual display of a Controller in order to keep sync + * with the object's current value. + * @returns {dat.controllers.Controller} this + */ + updateDisplay: function() { + return this; + }, + + /** + * @returns {Boolean} true if the value has deviated from initialValue + */ + isModified: function() { + return this.initialValue !== this.getValue() + } + + } + + ); + + return Controller; + + + })(dat.utils.common); + + + dat.dom.dom = (function (common) { + + var EVENT_MAP = { + 'HTMLEvents': ['change'], + 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'], + 'KeyboardEvents': ['keydown'] + }; + + var EVENT_MAP_INV = {}; + common.each(EVENT_MAP, function(v, k) { + common.each(v, function(e) { + EVENT_MAP_INV[e] = k; + }); + }); + + var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; + + function cssValueToPixels(val) { + + if (val === '0' || common.isUndefined(val)) return 0; + + var match = val.match(CSS_VALUE_PIXELS); + + if (!common.isNull(match)) { + return parseFloat(match[1]); + } + + // TODO ...ems? %? + + return 0; + + } + + /** + * @namespace + * @member dat.dom + */ + var dom = { + + /** + * + * @param elem + * @param selectable + */ + makeSelectable: function(elem, selectable) { + + if (elem === undefined || elem.style === undefined) return; + + elem.onselectstart = selectable ? function() { + return false; + } : function() { + }; + + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + + }, + + /** + * + * @param elem + * @param horizontal + * @param vertical + */ + makeFullscreen: function(elem, horizontal, vertical) { + + if (common.isUndefined(horizontal)) horizontal = true; + if (common.isUndefined(vertical)) vertical = true; + + elem.style.position = 'absolute'; + + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + + }, + + /** + * + * @param elem + * @param eventType + * @param params + */ + fakeEvent: function(elem, eventType, params, aux) { + params = params || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, + params.cancelable || true, window, params.clickCount || 1, + 0, //screen X + 0, //screen Y + clientX, //client X + clientY, //client Y + false, false, false, false, 0, null); + break; + case 'KeyboardEvents': + var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz + common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, + params.cancelable, window, + params.ctrlKey, params.altKey, + params.shiftKey, params.metaKey, + params.keyCode, params.charCode); + break; + default: + evt.initEvent(eventType, params.bubbles || false, + params.cancelable || true); + break; + } + common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + + /** + * + * @param elem + * @param event + * @param func + * @param bool + */ + bind: function(elem, event, func, bool) { + bool = bool || false; + if (elem.addEventListener) + elem.addEventListener(event, func, bool); + else if (elem.attachEvent) + elem.attachEvent('on' + event, func); + return dom; + }, + + /** + * + * @param elem + * @param event + * @param func + * @param bool + */ + unbind: function(elem, event, func, bool) { + bool = bool || false; + if (elem.removeEventListener) + elem.removeEventListener(event, func, bool); + else if (elem.detachEvent) + elem.detachEvent('on' + event, func); + return dom; + }, + + /** + * + * @param elem + * @param className + */ + addClass: function(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) == -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + + /** + * + * @param elem + * @param className + */ + removeClass: function(elem, className) { + if (className) { + if (elem.className === undefined) { + // elem.className = className; + } else if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index != -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + + hasClass: function(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + + /** + * + * @param elem + */ + getWidth: function(elem) { + + var style = getComputedStyle(elem); + + return cssValueToPixels(style['border-left-width']) + + cssValueToPixels(style['border-right-width']) + + cssValueToPixels(style['padding-left']) + + cssValueToPixels(style['padding-right']) + + cssValueToPixels(style['width']); + }, + + /** + * + * @param elem + */ + getHeight: function(elem) { + + var style = getComputedStyle(elem); + + return cssValueToPixels(style['border-top-width']) + + cssValueToPixels(style['border-bottom-width']) + + cssValueToPixels(style['padding-top']) + + cssValueToPixels(style['padding-bottom']) + + cssValueToPixels(style['height']); + }, + + /** + * + * @param elem + */ + getOffset: function(elem) { + var offset = {left: 0, top:0}; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + } while (elem = elem.offsetParent); + } + return offset; + }, + + // http://stackoverflow.com/posts/2684561/revisions + /** + * + * @param elem + */ + isActive: function(elem) { + return elem === document.activeElement && ( elem.type || elem.href ); + } + + }; + + return dom; + + })(dat.utils.common); + + + dat.controllers.OptionController = (function (Controller, dom, common) { + + /** + * @class Provides a select input to alter the property of an object, using a + * list of accepted values. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object|string[]} options A map of labels to acceptable values, or + * a list of acceptable string values. + * + * @member dat.controllers + */ + var OptionController = function(object, property, options) { + + OptionController.superclass.call(this, object, property); + + var _this = this; + + /** + * The drop down menu + * @ignore + */ + this.__select = document.createElement('select'); + + if (common.isArray(options)) { + var map = {}; + common.each(options, function(element) { + map[element] = element; + }); + options = map; + } + + common.each(options, function(value, key) { + + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + + }); + + // Acknowledge original value + this.updateDisplay(); + + dom.bind(this.__select, 'change', function() { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + + this.domElement.appendChild(this.__select); + + }; + + OptionController.superclass = Controller; + + common.extend( + + OptionController.prototype, + Controller.prototype, + + { + + setValue: function(v) { + var toReturn = OptionController.superclass.prototype.setValue.call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + }, + + updateDisplay: function() { + this.__select.value = this.getValue(); + return OptionController.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + return OptionController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.NumberController = (function (Controller, common) { + + /** + * @class Represents a given property of an object that is a number. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object} [params] Optional parameters + * @param {Number} [params.min] Minimum allowed value + * @param {Number} [params.max] Maximum allowed value + * @param {Number} [params.step] Increment by which to change value + * + * @member dat.controllers + */ + var NumberController = function(object, property, params) { + + NumberController.superclass.call(this, object, property); + + params = params || {}; + + this.__min = params.min; + this.__max = params.max; + this.__step = params.step; + + if (common.isUndefined(this.__step)) { + + if (this.initialValue == 0) { + this.__impliedStep = 1; // What are we, psychics? + } else { + // Hey Doug, check this out. + this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10; + } + + } else { + + this.__impliedStep = this.__step; + + } + + this.__precision = numDecimals(this.__impliedStep); + + + }; + + NumberController.superclass = Controller; + + common.extend( + + NumberController.prototype, + Controller.prototype, + + /** @lends dat.controllers.NumberController.prototype */ + { + + setValue: function(v) { + + if (this.__min !== undefined && v < this.__min) { + v = this.__min; + } else if (this.__max !== undefined && v > this.__max) { + v = this.__max; + } + + if (this.__step !== undefined && v % this.__step != 0) { + v = Math.round(v / this.__step) * this.__step; + } + + return NumberController.superclass.prototype.setValue.call(this, v); + + }, + + /** + * Specify a minimum value for object[property]. + * + * @param {Number} minValue The minimum value for + * object[property] + * @returns {dat.controllers.NumberController} this + */ + min: function(v) { + this.__min = v; + return this; + }, + + /** + * Specify a maximum value for object[property]. + * + * @param {Number} maxValue The maximum value for + * object[property] + * @returns {dat.controllers.NumberController} this + */ + max: function(v) { + this.__max = v; + return this; + }, + + /** + * Specify a step value that dat.controllers.NumberController + * increments by. + * + * @param {Number} stepValue The step value for + * dat.controllers.NumberController + * @default if minimum and maximum specified increment is 1% of the + * difference otherwise stepValue is 1 + * @returns {dat.controllers.NumberController} this + */ + step: function(v) { + this.__step = v; + return this; + } + + } + + ); + + function numDecimals(x) { + x = x.toString(); + if (x.indexOf('.') > -1) { + return x.length - x.indexOf('.') - 1; + } else { + return 0; + } + } + + return NumberController; + + })(dat.controllers.Controller, + dat.utils.common); + + + dat.controllers.NumberControllerBox = (function (NumberController, dom, common) { + + /** + * @class Represents a given property of an object that is a number and + * provides an input element with which to manipulate it. + * + * @extends dat.controllers.Controller + * @extends dat.controllers.NumberController + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object} [params] Optional parameters + * @param {Number} [params.min] Minimum allowed value + * @param {Number} [params.max] Maximum allowed value + * @param {Number} [params.step] Increment by which to change value + * + * @member dat.controllers + */ + var NumberControllerBox = function(object, property, params) { + + this.__truncationSuspended = false; + + NumberControllerBox.superclass.call(this, object, property, params); + + var _this = this; + + /** + * {Number} Previous mouse y position + * @ignore + */ + var prev_y; + + this.__input = document.createElement('input'); + this.__input.setAttribute('type', 'text'); + + // Makes it so manually specified values are not truncated. + + dom.bind(this.__input, 'change', onChange); + dom.bind(this.__input, 'blur', onBlur); + dom.bind(this.__input, 'mousedown', onMouseDown); + dom.bind(this.__input, 'keydown', function(e) { + + // When pressing entire, you can be as precise as you want. + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + } + + }); + + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!common.isNaN(attempted)) _this.setValue(attempted); + } + + function onBlur() { + onChange(); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prev_y = e.clientY; + } + + function onMouseDrag(e) { + + var diff = prev_y - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + + prev_y = e.clientY; + + } + + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + } + + this.updateDisplay(); + + this.domElement.appendChild(this.__input); + + }; + + NumberControllerBox.superclass = NumberController; + + common.extend( + + NumberControllerBox.prototype, + NumberController.prototype, + + { + + updateDisplay: function() { + + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return NumberControllerBox.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; + } + + return NumberControllerBox; + + })(dat.controllers.NumberController, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) { + + /** + * @class Represents a given property of an object that is a number, contains + * a minimum and maximum, and provides a slider element with which to + * manipulate it. It should be noted that the slider element is made up of + * <div> tags, not the html5 + * <slider> element. + * + * @extends dat.controllers.Controller + * @extends dat.controllers.NumberController + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Number} minValue Minimum allowed value + * @param {Number} maxValue Maximum allowed value + * @param {Number} stepValue Increment by which to change value + * + * @member dat.controllers + */ + var NumberControllerSlider = function(object, property, min, max, step) { + + NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step }); + + var _this = this; + + this.__background = document.createElement('div'); + this.__foreground = document.createElement('div'); + + + + dom.bind(this.__background, 'mousedown', onMouseDown); + + dom.addClass(this.__background, 'slider'); + dom.addClass(this.__foreground, 'slider-fg'); + + function onMouseDown(e) { + + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + + onMouseDrag(e); + } + + function onMouseDrag(e) { + + e.preventDefault(); + + var offset = dom.getOffset(_this.__background); + var width = dom.getWidth(_this.__background); + + _this.setValue( + map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max) + ); + + return false; + + } + + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + this.updateDisplay(); + + this.__background.appendChild(this.__foreground); + this.domElement.appendChild(this.__background); + + }; + + NumberControllerSlider.superclass = NumberController; + + /** + * Injects default stylesheet for slider elements. + */ + NumberControllerSlider.useDefaultStyles = function() { + css.inject(styleSheet); + }; + + common.extend( + + NumberControllerSlider.prototype, + NumberController.prototype, + + { + + updateDisplay: function() { + var pct = (this.getValue() - this.__min)/(this.__max - this.__min); + this.__foreground.style.width = pct*100+'%'; + return NumberControllerSlider.superclass.prototype.updateDisplay.call(this); + } + + } + + + + ); + + function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); + } + + return NumberControllerSlider; + + })(dat.controllers.NumberController, + dat.dom.dom, + dat.utils.css, + dat.utils.common, + ".slider {\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\n height: 1em;\n border-radius: 1em;\n background-color: #eee;\n padding: 0 0.5em;\n overflow: hidden;\n}\n\n.slider-fg {\n padding: 1px 0 2px 0;\n background-color: #aaa;\n height: 1em;\n margin-left: -0.5em;\n padding-right: 0.5em;\n border-radius: 1em 0 0 1em;\n}\n\n.slider-fg:after {\n display: inline-block;\n border-radius: 1em;\n background-color: #fff;\n border: 1px solid #aaa;\n content: '';\n float: right;\n margin-right: -1em;\n margin-top: -1px;\n height: 0.9em;\n width: 0.9em;\n}"); + + + dat.controllers.FunctionController = (function (Controller, dom, common) { + + /** + * @class Provides a GUI interface to fire a specified method, a property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var FunctionController = function(object, property, text) { + + FunctionController.superclass.call(this, object, property); + + var _this = this; + + this.__button = document.createElement('div'); + this.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(this.__button, 'click', function(e) { + e.preventDefault(); + _this.fire(); + return false; + }); + + dom.addClass(this.__button, 'button'); + + this.domElement.appendChild(this.__button); + + + }; + + FunctionController.superclass = Controller; + + common.extend( + + FunctionController.prototype, + Controller.prototype, + { + + fire: function() { + if (this.__onChange) { + this.__onChange.call(this); + } + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.getValue().call(this.object); + } + } + + ); + + return FunctionController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.BooleanController = (function (Controller, dom, common) { + + /** + * @class Provides a checkbox input to alter the boolean property of an object. + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var BooleanController = function(object, property) { + + BooleanController.superclass.call(this, object, property); + + var _this = this; + this.__prev = this.getValue(); + + this.__checkbox = document.createElement('input'); + this.__checkbox.setAttribute('type', 'checkbox'); + + + dom.bind(this.__checkbox, 'change', onChange, false); + + this.domElement.appendChild(this.__checkbox); + + // Match original value + this.updateDisplay(); + + function onChange() { + _this.setValue(!_this.__prev); + } + + }; + + BooleanController.superclass = Controller; + + common.extend( + + BooleanController.prototype, + Controller.prototype, + + { + + setValue: function(v) { + var toReturn = BooleanController.superclass.prototype.setValue.call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + }, + + updateDisplay: function() { + + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + } else { + this.__checkbox.checked = false; + } + + return BooleanController.superclass.prototype.updateDisplay.call(this); + + } + + + } + + ); + + return BooleanController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.color.toString = (function (common) { + + return function(color) { + + if (color.a == 1 || common.isUndefined(color.a)) { + + var s = color.hex.toString(16); + while (s.length < 6) { + s = '0' + s; + } + + return '#' + s; + + } else { + + return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')'; + + } + + } + + })(dat.utils.common); + + + dat.color.interpret = (function (toString, common) { + + var result, toReturn; + + var interpret = function() { + + toReturn = false; + + var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0]; + + common.each(INTERPRETATIONS, function(family) { + + if (family.litmus(original)) { + + common.each(family.conversions, function(conversion, conversionName) { + + result = conversion.read(original); + + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return common.BREAK; + + } + + }); + + return common.BREAK; + + } + + }); + + return toReturn; + + }; + + var INTERPRETATIONS = [ + + // Strings + { + + litmus: common.isString, + + conversions: { + + THREE_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt( + '0x' + + test[1].toString() + test[1].toString() + + test[2].toString() + test[2].toString() + + test[3].toString() + test[3].toString()) + }; + + }, + + write: toString + + }, + + SIX_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString()) + }; + + }, + + write: toString + + }, + + CSS_RGB: { + + read: function(original) { + + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + + }, + + write: toString + + }, + + CSS_RGBA: { + + read: function(original) { + + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + + }, + + write: toString + + } + + } + + }, + + // Numbers + { + + litmus: common.isNumber, + + conversions: { + + HEX: { + read: function(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + } + }, + + write: function(color) { + return color.hex; + } + } + + } + + }, + + // Arrays + { + + litmus: common.isArray, + + conversions: { + + RGB_ARRAY: { + read: function(original) { + if (original.length != 3) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b]; + } + + }, + + RGBA_ARRAY: { + read: function(original) { + if (original.length != 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b, color.a]; + } + + } + + } + + }, + + // Objects + { + + litmus: common.isObject, + + conversions: { + + RGBA_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b) && + common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + } + } + }, + + RGB_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b + } + } + }, + + HSVA_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v) && + common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + } + } + }, + + HSV_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v + } + } + + } + + } + + } + + + ]; + + return interpret; + + + })(dat.color.toString, + dat.utils.common); + + + dat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) { + + css.inject(styleSheet); + + /** Outer-most className for GUI's */ + var CSS_NAMESPACE = 'dg'; + + var HIDE_KEY_CODE = 72; + + /** The only value shared between the JS and SCSS. Use caution. */ + var CLOSE_BUTTON_HEIGHT = 20; + + var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; + + var SUPPORTS_LOCAL_STORAGE = (function() { + try { + return 'localStorage' in window && window['localStorage'] !== null; + } catch (e) { + return false; + } + })(); + + var SAVE_DIALOGUE; + + /** Have we yet to create an autoPlace GUI? */ + var auto_place_virgin = true; + + /** Fixed position div that auto place GUI's go inside */ + var auto_place_container; + + /** Are we hiding the GUI's ? */ + var hide = false; + + /** GUI's which should be hidden */ + var hideable_guis = []; + + /** + * A lightweight controller library for JavaScript. It allows you to easily + * manipulate variables and fire functions on the fly. + * @class + * + * @member dat.gui + * + * @param {Object} [params] + * @param {String} [params.name] The name of this GUI. + * @param {Object} [params.load] JSON object representing the saved state of + * this GUI. + * @param {Boolean} [params.auto=true] + * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in. + * @param {Boolean} [params.closed] If true, starts closed + */ + var GUI = function(params) { + + var _this = this; + + /** + * Outermost DOM Element + * @type DOMElement + */ + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + + dom.addClass(this.domElement, CSS_NAMESPACE); + + /** + * Nested GUI's by name + * @ignore + */ + this.__folders = {}; + + this.__controllers = []; + + /** + * List of objects I'm remembering for save, only used in top level GUI + * @ignore + */ + this.__rememberedObjects = []; + + /** + * Maps the index of remembered objects to a map of controllers, only used + * in top level GUI. + * + * @private + * @ignore + * + * @example + * [ + * { + * propertyName: Controller, + * anotherPropertyName: Controller + * }, + * { + * propertyName: Controller + * } + * ] + */ + this.__rememberedObjectIndecesToControllers = []; + + this.__listening = []; + + params = params || {}; + + // Default parameters + params = common.defaults(params, { + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + + params = common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + + + if (!common.isUndefined(params.load)) { + + // Explicit preset + if (params.preset) params.load.preset = params.preset; + + } else { + + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + + } + + if (common.isUndefined(params.parent) && params.hideable) { + hideable_guis.push(this); + } + + // Only root level GUI's are resizable. + params.resizable = common.isUndefined(params.parent) && params.resizable; + + + if (params.autoPlace && common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + // params.scrollable = common.isUndefined(params.parent) && params.scrollable === true; + + // Not part of params because I don't want people passing this in via + // constructor. Should be a 'remembered' value. + var use_local_storage = + SUPPORTS_LOCAL_STORAGE && + localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + + Object.defineProperties(this, + + /** @lends dat.gui.GUI.prototype */ + { + + /** + * The parent GUI + * @type dat.gui.GUI + */ + parent: { + get: function() { + return params.parent; + } + }, + + scrollable: { + get: function() { + return params.scrollable; + } + }, + + /** + * Handles GUI's element placement for you + * @type Boolean + */ + autoPlace: { + get: function() { + return params.autoPlace; + } + }, + + /** + * The identifier for a set of saved values + * @type String + */ + preset: { + + get: function() { + if (_this.parent) { + return _this.getRoot().preset; + } else { + return params.load.preset; + } + }, + + set: function(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + + }, + + /** + * The width of GUI element + * @type Number + */ + width: { + get: function() { + return params.width; + }, + set: function(v) { + params.width = v; + setWidth(_this, v); + } + }, + + /** + * The name of GUI. Used for folders. i.e + * a folder's name + * @type String + */ + name: { + get: function() { + return params.name; + }, + set: function(v) { + // TODO Check for collisions among sibling folders + params.name = v; + if (title_row_name) { + title_row_name.innerHTML = params.name; + } + } + }, + + /** + * Whether the GUI is collapsed or not + * @type Boolean + */ + closed: { + get: function() { + return params.closed; + }, + set: function(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + // For browsers that aren't going to respect the CSS transition, + // Lets just check our height against the window height right off + // the bat. + this.onResize(); + + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + + /** + * Contains all presets + * @type Object + */ + load: { + get: function() { + return params.load; + } + }, + + /** + * Determines whether or not to use localStorage as the means for + * remembering + * @type Boolean + */ + useLocalStorage: { + + get: function() { + return use_local_storage; + }, + set: function(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + use_local_storage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + + } + + }); + + // Are we a root level GUI? + if (common.isUndefined(params.parent)) { + + params.closed = false; + + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + + // Are we supposed to be loading locally? + if (SUPPORTS_LOCAL_STORAGE) { + + if (use_local_storage) { + + _this.useLocalStorage = true; + + var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + + if (saved_gui) { + params.load = JSON.parse(saved_gui); + } + + } + + } + + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + this.domElement.appendChild(this.__closeButton); + + dom.bind(this.__closeButton, 'click', function() { + + _this.closed = !_this.closed; + + + }); + + + // Oh, you're a nested GUI! + } else { + + if (params.closed === undefined) { + params.closed = true; + } + + var title_row_name = document.createTextNode(params.name); + dom.addClass(title_row_name, 'controller-name'); + + var title_row = addRow(_this, title_row_name); + + var on_click_title = function(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + + dom.addClass(title_row, 'title'); + dom.bind(title_row, 'click', on_click_title); + + if (!params.closed) { + this.closed = false; + } + + } + + if (params.autoPlace) { + + if (common.isUndefined(params.parent)) { + + if (auto_place_virgin) { + auto_place_container = document.createElement('div'); + dom.addClass(auto_place_container, CSS_NAMESPACE); + dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(auto_place_container); + auto_place_virgin = false; + } + + // Put it in the dom for you. + auto_place_container.appendChild(this.domElement); + + // Apply the auto styles + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + + } + + + // Make it not elastic. + if (!this.parent) setWidth(_this, params.width); + + } + + dom.bind(window, 'resize', function() { _this.onResize() }); + dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); }); + dom.bind(this.__ul, 'transitionend', function() { _this.onResize() }); + dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() }); + this.onResize(); + + + if (params.resizable) { + addResizeHandle(this); + } + + function saveToLocalStorage() { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + + var root = _this.getRoot(); + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + common.defer(function() { + root.width -= 1; + }); + } + + if (!params.parent) { + resetWidth(); + } + + }; + + GUI.toggleHide = function() { + + hide = !hide; + common.each(hideable_guis, function(gui) { + gui.domElement.style.zIndex = hide ? -999 : 999; + gui.domElement.style.opacity = hide ? 0 : 1; + }); + }; + + GUI.CLASS_AUTO_PLACE = 'a'; + GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; + GUI.CLASS_MAIN = 'main'; + GUI.CLASS_CONTROLLER_ROW = 'cr'; + GUI.CLASS_TOO_TALL = 'taller-than-window'; + GUI.CLASS_CLOSED = 'closed'; + GUI.CLASS_CLOSE_BUTTON = 'close-button'; + GUI.CLASS_DRAG = 'drag'; + + GUI.DEFAULT_WIDTH = 245; + GUI.TEXT_CLOSED = 'Close Controls'; + GUI.TEXT_OPEN = 'Open Controls'; + + dom.bind(window, 'keydown', function(e) { + + if (document.activeElement.type !== 'text' && + (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) { + GUI.toggleHide(); + } + + }, false); + + common.extend( + + GUI.prototype, + + /** @lends dat.gui.GUI */ + { + + /** + * @param object + * @param property + * @returns {dat.controllers.Controller} The new controller that was added. + * @instance + */ + add: function(object, property) { + + return add( + this, + object, + property, + { + factoryArgs: Array.prototype.slice.call(arguments, 2) + } + ); + + }, + + /** + * @param object + * @param property + * @returns {dat.controllers.ColorController} The new controller that was added. + * @instance + */ + addColor: function(object, property) { + + return add( + this, + object, + property, + { + color: true + } + ); + + }, + + /** + * @param controller + * @instance + */ + remove: function(controller) { + + // TODO listening? + this.__ul.removeChild(controller.__li); + this.__controllers.slice(this.__controllers.indexOf(controller), 1); + var _this = this; + common.defer(function() { + _this.onResize(); + }); + + }, + + destroy: function() { + + if (this.autoPlace) { + auto_place_container.removeChild(this.domElement); + } + + }, + + /** + * @param name + * @returns {dat.gui.GUI} The new folder. + * @throws {Error} if this GUI already has a folder by the specified + * name + * @instance + */ + addFolder: function(name) { + + // We have to prevent collisions on names in order to have a key + // by which to remember saved values + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + + ' name "' + name + '"'); + } + + var new_gui_params = { name: name, parent: this }; + + // We need to pass down the autoPlace trait so that we can + // attach event listeners to open/close folder actions to + // ensure that a scrollbar appears if the window is too short. + new_gui_params.autoPlace = this.autoPlace; + + // Do we have saved appearance data for this folder? + + if (this.load && // Anything loaded? + this.load.folders && // Was my parent a dead-end? + this.load.folders[name]) { // Did daddy remember me? + + // Start me closed if I was closed + new_gui_params.closed = this.load.folders[name].closed; + + // Pass down the loaded data + new_gui_params.load = this.load.folders[name]; + + } + + var gui = new GUI(new_gui_params); + this.__folders[name] = gui; + + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + + }, + + open: function() { + this.closed = false; + }, + + close: function() { + this.closed = true; + }, + + onResize: function() { + + var root = this.getRoot(); + + if (root.scrollable) { + + var top = dom.getOffset(root.__ul).top; + var h = 0; + + common.each(root.__ul.childNodes, function(node) { + if (! (root.autoPlace && node === root.__save_row)) + h += dom.getHeight(node); + }); + + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + + } + + if (root.__resize_handle) { + common.defer(function() { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + + }, + + /** + * Mark objects for saving. The order of these objects cannot change as + * the GUI grows. When remembering new objects, append them to the end + * of the list. + * + * @param {Object...} objects + * @throws {Error} if not called on a top level GUI. + * @instance + */ + remember: function() { + + if (common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents; + } + + if (this.parent) { + throw new Error("You can only call remember on a top level GUI."); + } + + var _this = this; + + common.each(Array.prototype.slice.call(arguments), function(object) { + if (_this.__rememberedObjects.length == 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) == -1) { + _this.__rememberedObjects.push(object); + } + }); + + if (this.autoPlace) { + // Set save row width + setWidth(this, this.width); + } + + }, + + /** + * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI. + * @instance + */ + getRoot: function() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + + /** + * @returns {Object} a JSON object representing the current state of + * this GUI as well as its remembered properties. + * @instance + */ + getSaveObject: function() { + + var toReturn = this.load; + + toReturn.closed = this.closed; + + // Am I remembering any values? + if (this.__rememberedObjects.length > 0) { + + toReturn.preset = this.preset; + + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + + toReturn.remembered[this.preset] = getCurrentPreset(this); + + } + + toReturn.folders = {}; + common.each(this.__folders, function(element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + + return toReturn; + + }, + + save: function() { + + if (!this.load.remembered) { + this.load.remembered = {}; + } + + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + + }, + + saveAs: function(presetName) { + + if (!this.load.remembered) { + + // Retain default values upon first save + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + + } + + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + + }, + + revert: function(gui) { + + common.each(this.__controllers, function(controller) { + // Make revert work on Default. + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + }, this); + + common.each(this.__folders, function(folder) { + folder.revert(folder); + }); + + if (!gui) { + markPresetModified(this.getRoot(), false); + } + + + }, + + listen: function(controller) { + + var init = this.__listening.length == 0; + this.__listening.push(controller); + if (init) updateDisplays(this.__listening); + + } + + } + + ); + + function add(gui, object, property, params) { + + if (object[property] === undefined) { + throw new Error("Object " + object + " has no property \"" + property + "\""); + } + + var controller; + + if (params.color) { + + controller = new ColorController(object, property); + + } else { + + var factoryArgs = [object,property].concat(params.factoryArgs); + controller = controllerFactory.apply(gui, factoryArgs); + + } + + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + + recallSavedValue(gui, controller); + + dom.addClass(controller.domElement, 'c'); + + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + + var li = addRow(gui, container, params.before); + + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + dom.addClass(li, typeof controller.getValue()); + + augmentController(gui, li, controller); + + gui.__controllers.push(controller); + + return controller; + + } + + /** + * Add a row to the end of the GUI or before another row. + * + * @param gui + * @param [dom] If specified, inserts the dom content in the new row + * @param [liBefore] If specified, places the new row before another row + */ + function addRow(gui, dom, liBefore) { + var li = document.createElement('li'); + if (dom) li.appendChild(dom); + if (liBefore) { + gui.__ul.insertBefore(li, params.before); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; + } + + function augmentController(gui, li, controller) { + + controller.__li = li; + controller.__gui = gui; + + common.extend(controller, { + + options: function(options) { + + if (arguments.length > 1) { + controller.remove(); + + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [common.toArray(arguments)] + } + ); + + } + + if (common.isArray(options) || common.isObject(options)) { + controller.remove(); + + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [options] + } + ); + + } + + }, + + name: function(v) { + controller.__li.firstElementChild.firstElementChild.innerHTML = v; + return controller; + }, + + listen: function() { + controller.__gui.listen(controller); + return controller; + }, + + remove: function() { + controller.__gui.remove(controller); + return controller; + } + + }); + + // All sliders should be accompanied by a box. + if (controller instanceof NumberControllerSlider) { + + var box = new NumberControllerBox(controller.object, controller.property, + { min: controller.__min, max: controller.__max, step: controller.__step }); + + common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function() { + var args = Array.prototype.slice.call(arguments); + pc.apply(controller, args); + return pb.apply(box, args); + } + }); + + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + + } + else if (controller instanceof NumberControllerBox) { + + var r = function(returned) { + + // Have we defined both boundaries? + if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) { + + // Well, then lets just replace this with a slider. + controller.remove(); + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + + } + + return returned; + + }; + + controller.min = common.compose(r, controller.min); + controller.max = common.compose(r, controller.max); + + } + else if (controller instanceof BooleanController) { + + dom.bind(li, 'click', function() { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + + dom.bind(controller.__checkbox, 'click', function(e) { + e.stopPropagation(); // Prevents double-toggle + }) + + } + else if (controller instanceof FunctionController) { + + dom.bind(li, 'click', function() { + dom.fakeEvent(controller.__button, 'click'); + }); + + dom.bind(li, 'mouseover', function() { + dom.addClass(controller.__button, 'hover'); + }); + + dom.bind(li, 'mouseout', function() { + dom.removeClass(controller.__button, 'hover'); + }); + + } + else if (controller instanceof ColorController) { + + dom.addClass(li, 'color'); + controller.updateDisplay = common.compose(function(r) { + li.style.borderLeftColor = controller.__color.toString(); + return r; + }, controller.updateDisplay); + + controller.updateDisplay(); + + } + + controller.setValue = common.compose(function(r) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return r; + }, controller.setValue); + + } + + function recallSavedValue(gui, controller) { + + // Find the topmost GUI, that's where remembered objects live. + var root = gui.getRoot(); + + // Does the object we're controlling match anything we've been told to + // remember? + var matched_index = root.__rememberedObjects.indexOf(controller.object); + + // Why yes, it does! + if (matched_index != -1) { + + // Let me fetch a map of controllers for thcommon.isObject. + var controller_map = + root.__rememberedObjectIndecesToControllers[matched_index]; + + // Ohp, I believe this is the first controller we've created for this + // object. Lets make the map fresh. + if (controller_map === undefined) { + controller_map = {}; + root.__rememberedObjectIndecesToControllers[matched_index] = + controller_map; + } + + // Keep track of this controller + controller_map[controller.property] = controller; + + // Okay, now have we saved any values for this controller? + if (root.load && root.load.remembered) { + + var preset_map = root.load.remembered; + + // Which preset are we trying to load? + var preset; + + if (preset_map[gui.preset]) { + + preset = preset_map[gui.preset]; + + } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) { + + // Uhh, you can have the default instead? + preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME]; + + } else { + + // Nada. + + return; + + } + + + // Did the loaded object remember thcommon.isObject? + if (preset[matched_index] && + + // Did we remember this particular property? + preset[matched_index][controller.property] !== undefined) { + + // We did remember something for this guy ... + var value = preset[matched_index][controller.property]; + + // And that's what it is. + controller.initialValue = value; + controller.setValue(value); + + } + + } + + } + + } + + function getLocalStorageHash(gui, key) { + // TODO how does this deal with multiple GUI's? + return document.location.href + '.' + key; + + } + + function addSaveMenu(gui) { + + var div = gui.__save_row = document.createElement('li'); + + dom.addClass(gui.domElement, 'has-save'); + + gui.__ul.insertBefore(div, gui.__ul.firstChild); + + dom.addClass(div, 'save-row'); + + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + + // TODO replace with FunctionController + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + + var select = gui.__preset_select = document.createElement('select'); + + if (gui.load && gui.load.remembered) { + + common.each(gui.load.remembered, function(value, key) { + addPresetOption(gui, key, key == gui.preset); + }); + + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + + dom.bind(select, 'change', function() { + + + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + + gui.preset = this.value; + + }); + + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + + if (SUPPORTS_LOCAL_STORAGE) { + + var saveLocally = document.getElementById('dg-save-locally'); + var explain = document.getElementById('dg-local-explain'); + + saveLocally.style.display = 'block'; + + var localStorageCheckBox = document.getElementById('dg-local-storage'); + + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + + function showHideExplain() { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; + } + + showHideExplain(); + + // TODO: Use a boolean controller, fool! + dom.bind(localStorageCheckBox, 'change', function() { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(); + }); + + } + + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + + dom.bind(newConstructorTextArea, 'keydown', function(e) { + if (e.metaKey && (e.which === 67 || e.keyCode == 67)) { + SAVE_DIALOGUE.hide(); + } + }); + + dom.bind(gears, 'click', function() { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + + dom.bind(button, 'click', function() { + gui.save(); + }); + + dom.bind(button2, 'click', function() { + var presetName = prompt('Enter a new preset name.'); + if (presetName) gui.saveAs(presetName); + }); + + dom.bind(button3, 'click', function() { + gui.revert(); + }); + + // div.appendChild(button2); + + } + + function addResizeHandle(gui) { + + gui.__resize_handle = document.createElement('div'); + + common.extend(gui.__resize_handle.style, { + + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + // border: '1px solid blue' + + }); + + var pmouseX; + + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); + + function dragStart(e) { + + e.preventDefault(); + + pmouseX = e.clientX; + + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + + return false; + + } + + function drag(e) { + + e.preventDefault(); + + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + + return false; + + } + + function dragStop() { + + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + + } + + } + + function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + // Auto placed save-rows are position fixed, so we have to + // set the width manually if we want it to bleed to the edge + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + }if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } + } + + function getCurrentPreset(gui, useInitialValues) { + + var toReturn = {}; + + // For each object I'm remembering + common.each(gui.__rememberedObjects, function(val, index) { + + var saved_values = {}; + + // The controllers I've made for thcommon.isObject by property + var controller_map = + gui.__rememberedObjectIndecesToControllers[index]; + + // Remember each value for each property + common.each(controller_map, function(controller, property) { + saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + + // Save the values for thcommon.isObject + toReturn[index] = saved_values; + + }); + + return toReturn; + + } + + function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } + } + + function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value == gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } + } + + function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + // console.log('mark', modified, opt); + if (modified) { + opt.innerHTML = opt.value + "*"; + } else { + opt.innerHTML = opt.value; + } + } + + function updateDisplays(controllerArray) { + + + if (controllerArray.length != 0) { + + requestAnimationFrame(function() { + updateDisplays(controllerArray); + }); + + } + + common.each(controllerArray, function(c) { + c.updateDisplay(); + }); + + } + + return GUI; + + })(dat.utils.css, + "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n \n
\n \n
\n\n
", + ".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n", + dat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) { + + return function(object, property) { + + var initialValue = object[property]; + + // Providing options? + if (common.isArray(arguments[2]) || common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + + // Providing a map? + + if (common.isNumber(initialValue)) { + + if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) { + + // Has min and max. + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + + } else { + + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + + } + + } + + if (common.isString(initialValue)) { + return new StringController(object, property); + } + + if (common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + + if (common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + + } + + })(dat.controllers.OptionController, + dat.controllers.NumberControllerBox, + dat.controllers.NumberControllerSlider, + dat.controllers.StringController = (function (Controller, dom, common) { + + /** + * @class Provides a text input to alter the string property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var StringController = function(object, property) { + + StringController.superclass.call(this, object, property); + + var _this = this; + + this.__input = document.createElement('input'); + this.__input.setAttribute('type', 'text'); + + dom.bind(this.__input, 'keyup', onChange); + dom.bind(this.__input, 'change', onChange); + dom.bind(this.__input, 'blur', onBlur); + dom.bind(this.__input, 'keydown', function(e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + + + function onChange() { + _this.setValue(_this.__input.value); + } + + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + this.updateDisplay(); + + this.domElement.appendChild(this.__input); + + }; + + StringController.superclass = Controller; + + common.extend( + + StringController.prototype, + Controller.prototype, + + { + + updateDisplay: function() { + // Stops the caret from moving on account of: + // keyup -> setValue -> updateDisplay + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return StringController.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + return StringController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common), + dat.controllers.FunctionController, + dat.controllers.BooleanController, + dat.utils.common), + dat.controllers.Controller, + dat.controllers.BooleanController, + dat.controllers.FunctionController, + dat.controllers.NumberControllerBox, + dat.controllers.NumberControllerSlider, + dat.controllers.OptionController, + dat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) { + + var ColorController = function(object, property) { + + ColorController.superclass.call(this, object, property); + + this.__color = new Color(this.getValue()); + this.__temp = new Color(0); + + var _this = this; + + this.domElement = document.createElement('div'); + + dom.makeSelectable(this.domElement, false); + + this.__selector = document.createElement('div'); + this.__selector.className = 'selector'; + + this.__saturation_field = document.createElement('div'); + this.__saturation_field.className = 'saturation-field'; + + this.__field_knob = document.createElement('div'); + this.__field_knob.className = 'field-knob'; + this.__field_knob_border = '2px solid '; + + this.__hue_knob = document.createElement('div'); + this.__hue_knob.className = 'hue-knob'; + + this.__hue_field = document.createElement('div'); + this.__hue_field.className = 'hue-field'; + + this.__input = document.createElement('input'); + this.__input.type = 'text'; + this.__input_textShadow = '0 1px 1px '; + + dom.bind(this.__input, 'keydown', function(e) { + if (e.keyCode === 13) { // on enter + onBlur.call(this); + } + }); + + dom.bind(this.__input, 'blur', onBlur); + + dom.bind(this.__selector, 'mousedown', function(e) { + + dom + .addClass(this, 'drag') + .bind(window, 'mouseup', function(e) { + dom.removeClass(_this.__selector, 'drag'); + }); + + }); + + var value_field = document.createElement('div'); + + common.extend(this.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + + common.extend(this.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + + common.extend(this.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + + common.extend(this.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + + common.extend(value_field.style, { + width: '100%', + height: '100%', + background: 'none' + }); + + linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000'); + + common.extend(this.__hue_field.style, { + width: '15px', + height: '100px', + display: 'inline-block', + border: '1px solid #555', + cursor: 'ns-resize' + }); + + hueGradient(this.__hue_field); + + common.extend(this.__input.style, { + outline: 'none', + // width: '120px', + textAlign: 'center', + // padding: '4px', + // marginBottom: '6px', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + + dom.bind(this.__saturation_field, 'mousedown', fieldDown); + dom.bind(this.__field_knob, 'mousedown', fieldDown); + + dom.bind(this.__hue_field, 'mousedown', function(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'mouseup', unbindH); + }); + + function fieldDown(e) { + setSV(e); + // document.body.style.cursor = 'none'; + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'mouseup', unbindSV); + } + + function unbindSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'mouseup', unbindSV); + // document.body.style.cursor = 'default'; + } + + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + + function unbindH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'mouseup', unbindH); + } + + this.__saturation_field.appendChild(value_field); + this.__selector.appendChild(this.__field_knob); + this.__selector.appendChild(this.__saturation_field); + this.__selector.appendChild(this.__hue_field); + this.__hue_field.appendChild(this.__hue_knob); + + this.domElement.appendChild(this.__input); + this.domElement.appendChild(this.__selector); + + this.updateDisplay(); + + function setSV(e) { + + e.preventDefault(); + + var w = dom.getWidth(_this.__saturation_field); + var o = dom.getOffset(_this.__saturation_field); + var s = (e.clientX - o.left + document.body.scrollLeft) / w; + var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w; + + if (v > 1) v = 1; + else if (v < 0) v = 0; + + if (s > 1) s = 1; + else if (s < 0) s = 0; + + _this.__color.v = v; + _this.__color.s = s; + + _this.setValue(_this.__color.toOriginal()); + + + return false; + + } + + function setH(e) { + + e.preventDefault(); + + var s = dom.getHeight(_this.__hue_field); + var o = dom.getOffset(_this.__hue_field); + var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s; + + if (h > 1) h = 1; + else if (h < 0) h = 0; + + _this.__color.h = h * 360; + + _this.setValue(_this.__color.toOriginal()); + + return false; + + } + + }; + + ColorController.superclass = Controller; + + common.extend( + + ColorController.prototype, + Controller.prototype, + + { + + updateDisplay: function() { + + var i = interpret(this.getValue()); + + if (i !== false) { + + var mismatch = false; + + // Check for mismatch on the interpreted value. + + common.each(Color.COMPONENTS, function(component) { + if (!common.isUndefined(i[component]) && + !common.isUndefined(this.__color.__state[component]) && + i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; // break + } + }, this); + + // If nothing diverges, we keep our previous values + // for statefulness, otherwise we recalculate fresh + if (mismatch) { + common.extend(this.__color.__state, i); + } + + } + + common.extend(this.__temp.__state, this.__color.__state); + + this.__temp.a = 1; + + var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0; + var _flip = 255 - flip; + + common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')' + }); + + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px' + + this.__temp.s = 1; + this.__temp.v = 1; + + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString()); + + common.extend(this.__input.style, { + backgroundColor: this.__input.value = this.__color.toString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip +')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)' + }); + + } + + } + + ); + + var vendors = ['-moz-','-o-','-webkit-','-ms-','']; + + function linearGradient(elem, x, a, b) { + elem.style.background = ''; + common.each(vendors, function(vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); '; + }); + } + + function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);' + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + } + + + return ColorController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.color.Color = (function (interpret, math, toString, common) { + + var Color = function() { + + this.__state = interpret.apply(this, arguments); + + if (this.__state === false) { + throw 'Failed to interpret color arguments'; + } + + this.__state.a = this.__state.a || 1; + + + }; + + Color.COMPONENTS = ['r','g','b','h','s','v','hex','a']; + + common.extend(Color.prototype, { + + toString: function() { + return toString(this); + }, + + toOriginal: function() { + return this.__state.conversion.write(this); + } + + }); + + defineRGBComponent(Color.prototype, 'r', 2); + defineRGBComponent(Color.prototype, 'g', 1); + defineRGBComponent(Color.prototype, 'b', 0); + + defineHSVComponent(Color.prototype, 'h'); + defineHSVComponent(Color.prototype, 's'); + defineHSVComponent(Color.prototype, 'v'); + + Object.defineProperty(Color.prototype, 'a', { + + get: function() { + return this.__state.a; + }, + + set: function(v) { + this.__state.a = v; + } + + }); + + Object.defineProperty(Color.prototype, 'hex', { + + get: function() { + + if (!this.__state.space !== 'HEX') { + this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b); + } + + return this.__state.hex; + + }, + + set: function(v) { + + this.__state.space = 'HEX'; + this.__state.hex = v; + + } + + }); + + function defineRGBComponent(target, component, componentHexIndex) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + + recalculateRGB(this, component, componentHexIndex); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'RGB') { + recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + + this.__state[component] = v; + + } + + }); + + } + + function defineHSVComponent(target, component) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'HSV') + return this.__state[component]; + + recalculateHSV(this); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'HSV') { + recalculateHSV(this); + this.__state.space = 'HSV'; + } + + this.__state[component] = v; + + } + + }); + + } + + function recalculateRGB(color, component, componentHexIndex) { + + if (color.__state.space === 'HEX') { + + color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex); + + } else if (color.__state.space === 'HSV') { + + common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + + } else { + + throw 'Corrupted color state'; + + } + + } + + function recalculateHSV(color) { + + var result = math.rgb_to_hsv(color.r, color.g, color.b); + + common.extend(color.__state, + { + s: result.s, + v: result.v + } + ); + + if (!common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } + + } + + return Color; + + })(dat.color.interpret, + dat.color.math = (function () { + + var tmpComponent; + + return { + + hsv_to_rgb: function(h, s, v) { + + var hi = Math.floor(h / 60) % 6; + + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - (f * s)); + var t = v * (1.0 - ((1.0 - f) * s)); + var c = [ + [v, t, p], + [q, v, p], + [p, v, t], + [p, q, v], + [t, p, v], + [v, p, q] + ][hi]; + + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + + }, + + rgb_to_hsv: function(r, g, b) { + + var min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s; + + if (max != 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + + if (r == max) { + h = (g - b) / delta; + } else if (g == max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + + rgb_to_hex: function(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + + component_from_hex: function(hex, componentIndex) { + return (hex >> (componentIndex * 8)) & 0xFF; + }, + + hex_with_component: function(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent)); + } + + } + + })(), + dat.color.toString, + dat.utils.common), + dat.color.interpret, + dat.utils.common), + dat.utils.requestAnimationFrame = (function () { + + /** + * requirejs version of Paul Irish's RequestAnimationFrame + * http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + */ + + return window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback, element) { + + window.setTimeout(callback, 1000 / 60); + + }; + })(), + dat.dom.CenteredDiv = (function (dom, common) { + + + var CenteredDiv = function() { + + this.backgroundElement = document.createElement('div'); + common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear' + }); + + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + + this.domElement = document.createElement('div'); + common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear' + }); + + + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + + var _this = this; + dom.bind(this.backgroundElement, 'click', function() { + _this.hide(); + }); + + + }; + + CenteredDiv.prototype.show = function() { + + var _this = this; + + + + this.backgroundElement.style.display = 'block'; + + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + // this.domElement.style.top = '52%'; + this.domElement.style.webkitTransform = 'scale(1.1)'; + + this.layout(); + + common.defer(function() { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + + }; + + CenteredDiv.prototype.hide = function() { + + var _this = this; + + var hide = function() { + + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + + }; + + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + + this.backgroundElement.style.opacity = 0; + // this.domElement.style.top = '48%'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + + }; + + CenteredDiv.prototype.layout = function() { + this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px'; + }; + + function lockScroll(e) { + console.log(e); + } + + return CenteredDiv; + + })(dat.dom.dom, + dat.utils.common), + dat.dom.dom, + dat.utils.common); + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + /** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + /** @namespace */ + var dat = module.exports = dat || {}; + + /** @namespace */ + dat.color = dat.color || {}; + + /** @namespace */ + dat.utils = dat.utils || {}; + + dat.utils.common = (function () { + + var ARR_EACH = Array.prototype.forEach; + var ARR_SLICE = Array.prototype.slice; + + /** + * Band-aid methods for things that should be a lot easier in JavaScript. + * Implementation and structure inspired by underscore.js + * http://documentcloud.github.com/underscore/ + */ + + return { + + BREAK: {}, + + extend: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (!this.isUndefined(obj[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + defaults: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (this.isUndefined(target[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + compose: function() { + var toCall = ARR_SLICE.call(arguments); + return function() { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length -1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + } + }, + + each: function(obj, itr, scope) { + + + if (ARR_EACH && obj.forEach === ARR_EACH) { + + obj.forEach(itr, scope); + + } else if (obj.length === obj.length + 0) { // Is number but not NaN + + for (var key = 0, l = obj.length; key < l; key++) + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) + return; + + } else { + + for (var key in obj) + if (itr.call(scope, obj[key], key) === this.BREAK) + return; + + } + + }, + + defer: function(fnc) { + setTimeout(fnc, 0); + }, + + toArray: function(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + + isUndefined: function(obj) { + return obj === undefined; + }, + + isNull: function(obj) { + return obj === null; + }, + + isNaN: function(obj) { + return obj !== obj; + }, + + isArray: Array.isArray || function(obj) { + return obj.constructor === Array; + }, + + isObject: function(obj) { + return obj === Object(obj); + }, + + isNumber: function(obj) { + return obj === obj+0; + }, + + isString: function(obj) { + return obj === obj+''; + }, + + isBoolean: function(obj) { + return obj === false || obj === true; + }, + + isFunction: function(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } + + }; + + })(); + + + dat.color.toString = (function (common) { + + return function(color) { + + if (color.a == 1 || common.isUndefined(color.a)) { + + var s = color.hex.toString(16); + while (s.length < 6) { + s = '0' + s; + } + + return '#' + s; + + } else { + + return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')'; + + } + + } + + })(dat.utils.common); + + + dat.Color = dat.color.Color = (function (interpret, math, toString, common) { + + var Color = function() { + + this.__state = interpret.apply(this, arguments); + + if (this.__state === false) { + throw 'Failed to interpret color arguments'; + } + + this.__state.a = this.__state.a || 1; + + + }; + + Color.COMPONENTS = ['r','g','b','h','s','v','hex','a']; + + common.extend(Color.prototype, { + + toString: function() { + return toString(this); + }, + + toOriginal: function() { + return this.__state.conversion.write(this); + } + + }); + + defineRGBComponent(Color.prototype, 'r', 2); + defineRGBComponent(Color.prototype, 'g', 1); + defineRGBComponent(Color.prototype, 'b', 0); + + defineHSVComponent(Color.prototype, 'h'); + defineHSVComponent(Color.prototype, 's'); + defineHSVComponent(Color.prototype, 'v'); + + Object.defineProperty(Color.prototype, 'a', { + + get: function() { + return this.__state.a; + }, + + set: function(v) { + this.__state.a = v; + } + + }); + + Object.defineProperty(Color.prototype, 'hex', { + + get: function() { + + if (!this.__state.space !== 'HEX') { + this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b); + } + + return this.__state.hex; + + }, + + set: function(v) { + + this.__state.space = 'HEX'; + this.__state.hex = v; + + } + + }); + + function defineRGBComponent(target, component, componentHexIndex) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + + recalculateRGB(this, component, componentHexIndex); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'RGB') { + recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + + this.__state[component] = v; + + } + + }); + + } + + function defineHSVComponent(target, component) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'HSV') + return this.__state[component]; + + recalculateHSV(this); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'HSV') { + recalculateHSV(this); + this.__state.space = 'HSV'; + } + + this.__state[component] = v; + + } + + }); + + } + + function recalculateRGB(color, component, componentHexIndex) { + + if (color.__state.space === 'HEX') { + + color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex); + + } else if (color.__state.space === 'HSV') { + + common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + + } else { + + throw 'Corrupted color state'; + + } + + } + + function recalculateHSV(color) { + + var result = math.rgb_to_hsv(color.r, color.g, color.b); + + common.extend(color.__state, + { + s: result.s, + v: result.v + } + ); + + if (!common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } + + } + + return Color; + + })(dat.color.interpret = (function (toString, common) { + + var result, toReturn; + + var interpret = function() { + + toReturn = false; + + var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0]; + + common.each(INTERPRETATIONS, function(family) { + + if (family.litmus(original)) { + + common.each(family.conversions, function(conversion, conversionName) { + + result = conversion.read(original); + + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return common.BREAK; + + } + + }); + + return common.BREAK; + + } + + }); + + return toReturn; + + }; + + var INTERPRETATIONS = [ + + // Strings + { + + litmus: common.isString, + + conversions: { + + THREE_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt( + '0x' + + test[1].toString() + test[1].toString() + + test[2].toString() + test[2].toString() + + test[3].toString() + test[3].toString()) + }; + + }, + + write: toString + + }, + + SIX_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString()) + }; + + }, + + write: toString + + }, + + CSS_RGB: { + + read: function(original) { + + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + + }, + + write: toString + + }, + + CSS_RGBA: { + + read: function(original) { + + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + + }, + + write: toString + + } + + } + + }, + + // Numbers + { + + litmus: common.isNumber, + + conversions: { + + HEX: { + read: function(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + } + }, + + write: function(color) { + return color.hex; + } + } + + } + + }, + + // Arrays + { + + litmus: common.isArray, + + conversions: { + + RGB_ARRAY: { + read: function(original) { + if (original.length != 3) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b]; + } + + }, + + RGBA_ARRAY: { + read: function(original) { + if (original.length != 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b, color.a]; + } + + } + + } + + }, + + // Objects + { + + litmus: common.isObject, + + conversions: { + + RGBA_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b) && + common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + } + } + }, + + RGB_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b + } + } + }, + + HSVA_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v) && + common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + } + } + }, + + HSV_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v + } + } + + } + + } + + } + + + ]; + + return interpret; + + + })(dat.color.toString, + dat.utils.common), + dat.color.math = (function () { + + var tmpComponent; + + return { + + hsv_to_rgb: function(h, s, v) { + + var hi = Math.floor(h / 60) % 6; + + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - (f * s)); + var t = v * (1.0 - ((1.0 - f) * s)); + var c = [ + [v, t, p], + [q, v, p], + [p, v, t], + [p, q, v], + [t, p, v], + [v, p, q] + ][hi]; + + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + + }, + + rgb_to_hsv: function(r, g, b) { + + var min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s; + + if (max != 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + + if (r == max) { + h = (g - b) / delta; + } else if (g == max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + + rgb_to_hex: function(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + + component_from_hex: function(hex, componentIndex) { + return (hex >> (componentIndex * 8)) & 0xFF; + }, + + hex_with_component: function(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent)); + } + + } + + })(), + dat.color.toString, + dat.utils.common); + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + // stats.js - http://github.com/mrdoob/stats.js + var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px"; + i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div"); + k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display= + "block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height= + a+"px",m=b,r=0);return b},update:function(){l=this.end()}}};"object"===typeof module&&(module.exports=Stats); + + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var THREE = __webpack_require__(6); + + var ProxyMaterial = exports.ProxyMaterial = new THREE.MeshLambertMaterial({ + color: 0xff0000 + }); + + var PROXY_BUFFER_SIZE = exports.PROXY_BUFFER_SIZE = 4; + + var ProxyGeometry = function () { + function ProxyGeometry(bounds) { + _classCallCheck(this, ProxyGeometry); + + this.group = new THREE.Group(); + this._buffer = new Float32Array(); + } + + _createClass(ProxyGeometry, [{ + key: 'add', + value: function add(mesh) { + this.group.add(mesh); + this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length); + this.computeBuffer(); + } + }, { + key: 'remove', + value: function remove(mesh) { + this.group.remove(mesh); + this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length); + this.computeBuffer(); + } + }, { + key: 'update', + value: function update() { + var t = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1 / 60; + var children = this.group.children; + + for (var i = 0; i < children.length; ++i) { + var child = children[i]; + // TODO: animate objects + } + this.computeBuffer(); + } + }, { + key: 'computeBuffer', + value: function computeBuffer() { + var children = this.group.children; + + for (var i = 0; i < children.length; ++i) { + var child = children[i]; + this._buffer[PROXY_BUFFER_SIZE * i] = child.position.x; + this._buffer[PROXY_BUFFER_SIZE * i + 1] = child.position.y; + this._buffer[PROXY_BUFFER_SIZE * i + 2] = child.position.z; + + if (child.geometry instanceof THREE.BoxGeometry) { + this._buffer[PROXY_BUFFER_SIZE * i + 3] = 0; + } else if (child.geometry instanceof THREE.SphereGeometry) { + this._buffer[PROXY_BUFFER_SIZE * i + 3] = 1; + } else if (child.geometry instanceof THREE.ConeGeometry) { + this._buffer[PROXY_BUFFER_SIZE * i + 3] = 2; + } else if (child.geometry instanceof THREE.PlaneGeometry) { + this._buffer[PROXY_BUFFER_SIZE * i + 3] = 3; + } + } + } + }, { + key: 'buffer', + get: function get() { + return this._buffer; + } + }]); + + return ProxyGeometry; + }(); + + exports.default = ProxyGeometry; + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + (function (global, factory) { + true ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.THREE = global.THREE || {}))); + }(this, (function (exports) { 'use strict'; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( Function.prototype.name === undefined ) { + + // Missing in IE9-11. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + 'use strict'; + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + EventDispatcher.prototype = { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = [], i = 0; + var length = listenerArray.length; + + for ( i = 0; i < length; i ++ ) { + + array[ i ] = listenerArray[ i ]; + + } + + for ( i = 0; i < length; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + }; + + var REVISION = '84'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var CullFaceFrontBack = 3; + var FrontFaceDirectionCW = 0; + var FrontFaceDirectionCCW = 1; + var BasicShadowMap = 0; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var SmoothShading = 2; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var RGBEFormat = RGBAFormat; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RGB_S3TC_DXT1_Format = 2001; + var RGBA_S3TC_DXT1_Format = 2002; + var RGBA_S3TC_DXT3_Format = 2003; + var RGBA_S3TC_DXT5_Format = 2004; + var RGB_PVRTC_4BPPV1_Format = 2100; + var RGB_PVRTC_2BPPV1_Format = 2101; + var RGBA_PVRTC_4BPPV1_Format = 2102; + var RGBA_PVRTC_2BPPV1_Format = 2103; + var RGB_ETC1_Format = 2151; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var LogLuvEncoding = 3003; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function generateUUID() { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i === 8 || i === 13 || i === 18 || i === 23 ) { + + uuid[ i ] = '-'; + + } else if ( i === 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + + } + + return uuid.join( '' ); + + }; + + }(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nearestPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Vector2.prototype = { + + constructor: Vector2, + + isVector2: true, + + get width() { + + return this.x; + + }, + + set width( value ) { + + this.x = value; + + }, + + get height() { + + return this.y; + + }, + + set height( value ) { + + this.y = value; + + }, + + // + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + + } else { + + this.x = 0; + this.y = 0; + + } + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector2(); + max = new Vector2(); + + } + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + lengthManhattan: function() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0; + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Texture.prototype = { + + constructor: Texture, + + isTexture: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + if ( meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image.toDataURL !== undefined ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + metadata: { + version: 4.4, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + wrap: [ this.wrapS, this.wrapT ], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + meta.textures[ this.uuid ] = output; + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return; + + uv.multiply( this.repeat ); + uv.add( this.offset ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + + }; + + Object.assign( Texture.prototype, EventDispatcher.prototype ); + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Vector4.prototype = { + + constructor: Vector4, + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + } else { + + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 0; + + } + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + }; + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.uuid = _Math.generateUUID(); + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + WebGLRenderTarget.prototype = { + + constructor: WebGLRenderTarget, + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + }; + + Object.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Quaternion.prototype = { + + constructor: Quaternion, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get w () { + + return this._w; + + }, + + set w ( value ) { + + this._w = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( (euler && euler.isEuler) === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var c1 = Math.cos( euler._x / 2 ); + var c2 = Math.cos( euler._y / 2 ); + var c3 = Math.cos( euler._z / 2 ); + var s1 = Math.sin( euler._x / 2 ); + var s2 = Math.sin( euler._y / 2 ); + var s3 = Math.sin( euler._z / 2 ); + + var order = euler.order; + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final + + // assumes direction vectors vFrom and vTo are normalized + + var v1, r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + inverse: function () { + + return this.conjugate().normalize(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + }; + + Object.assign( Quaternion, { + + slerp: function( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function( + dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Vector3.prototype = { + + constructor: Vector3, + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + } else { + + this.x = 0; + this.y = 0; + this.z = 0; + + } + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion; + + return function applyEuler( euler ) { + + if ( (euler && euler.isEuler) === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + if ( quaternion === undefined ) quaternion = new Quaternion(); + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion; + + return function applyAxisAngle( axis, angle ) { + + if ( quaternion === undefined ) quaternion = new Quaternion(); + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + var w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ]; + + return this.divideScalar( w ); + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix; + + return function project( camera ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix; + + return function unproject( camera ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector3(); + max = new Vector3(); + + } + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1; + + return function projectOnPlane( planeNormal ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1; + + return function reflect( normal ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function( s ) { + + var sinPhiRadius = Math.sin( s.phi ) * s.radius; + + this.x = sinPhiRadius * Math.sin( s.theta ); + this.y = Math.cos( s.phi ) * s.radius; + this.z = sinPhiRadius * Math.cos( s.theta ); + + return this; + + }, + + setFromCylindrical: function( c ) { + + this.x = c.radius * Math.sin( c.theta ); + this.y = c.y; + this.z = c.radius * Math.cos( c.theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + return this.setFromMatrixColumn( m, 3 ); + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + if ( typeof m === 'number' ) { + + console.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' ); + var temp = m; + m = index; + index = temp; + + } + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = new Float32Array( [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Matrix4.prototype = { + + constructor: Matrix4, + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + this.elements.set( m.elements ); + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1; + + return function extractRotation( m ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( (euler && euler.isEuler) === false ) { + + console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q.x, y = q.y, z = q.z, w = q.w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x, y, z; + + return function lookAt( eye, target, up ) { + + if ( x === undefined ) { + + x = new Vector3(); + y = new Vector3(); + z = new Vector3(); + + } + + var te = this.elements; + + z.subVectors( eye, target ).normalize(); + + if ( z.lengthSq() === 0 ) { + + z.z = 1; + + } + + x.crossVectors( up, z ).normalize(); + + if ( x.lengthSq() === 0 ) { + + z.z += 0.0001; + x.crossVectors( up, z ).normalize(); + + } + + y.crossVectors( z, x ); + + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyToArray: function ( a, b, r ) { + + var te = this.elements; + + this.multiplyMatrices( a, b ); + + r[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ]; + r[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ]; + r[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ]; + r[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ]; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1; + + return function applyToBufferAttribute( attribute ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector, matrix; + + return function decompose( position, quaternion, scale ) { + + if ( vector === undefined ) { + + vector = new Vector3(); + matrix = new Matrix4(); + + } + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) { + + sx = - sx; + + } + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + + matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy() + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); } + function setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform2fv( this.addr, v ); + else gl.uniform2f( this.addr, v.x, v.y ); + + } + + function setValue3fv( gl, v ) { + + if ( v.x !== undefined ) + gl.uniform3f( this.addr, v.x, v.y, v.z ); + else if ( v.r !== undefined ) + gl.uniform3f( this.addr, v.r, v.g, v.b ); + else + gl.uniform3fv( this.addr, v ); + + } + + function setValue4fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform4fv( this.addr, v ); + else gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, v.elements || v ); + + } + + function setValue3fm( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, v.elements || v ); + + } + + function setValue4fm( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, v.elements || v ); + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); } + function setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); } + function setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: return setValueT1; // SAMPLER_2D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); } + function setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) ); + + } + + function setValueV3a( gl, v ) { + + gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) ); + + } + + function setValueV4a( gl, v ) { + + gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) ); + + } + + function setValueM3a( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) ); + + } + + function setValueM4a( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function( gl, value ) { + + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ] ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + for (; ;) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || + subscript === '[' && matchEnd + 2 === pathLength ) { + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + // step into inner node / create it in case it doesn't exist + + var map = container.map, + next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + path = info.name, + addr = gl.getUniformLocation( program, path ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.set = function( gl, object, name ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + // note: always updating when .needsUpdate is undefined + + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( 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"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "float 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}\nvec2 ltcTextureCoords( const in GeometricContext geometry, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = (LUT_SIZE - 1.0)/LUT_SIZE;\n\tconst float LUT_BIAS = 0.5/LUT_SIZE;\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 P = geometry.position;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\n\tint config = 0;\n\tif ( L[0].z > 0.0 ) config += 1;\n\tif ( L[1].z > 0.0 ) config += 2;\n\tif ( L[2].z > 0.0 ) config += 4;\n\tif ( L[3].z > 0.0 ) config += 8;\n\tn = 0;\n\tif ( config == 0 ) {\n\t} else if ( config == 1 ) {\n\t\tn = 3;\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\n\t} else if ( config == 2 ) {\n\t\tn = 3;\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t} else if ( config == 3 ) {\n\t\tn = 4;\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\n\t} else if ( config == 4 ) {\n\t\tn = 3;\n\t\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\n\t\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\n\t} else if ( config == 5 ) {\n\t\tn = 0;\n\t} else if ( config == 6 ) {\n\t\tn = 4;\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\n\t} else if ( config == 7 ) {\n\t\tn = 5;\n\t\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\n\t\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\n\t} else if ( config == 8 ) {\n\t\tn = 3;\n\t\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\n\t\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\n\t\tL[2] = L[3];\n\t} else if ( config == 9 ) {\n\t\tn = 4;\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\n\t} else if ( config == 10 ) {\n\t\tn = 0;\n\t} else if ( config == 11 ) {\n\t\tn = 5;\n\t\tL[4] = L[3];\n\t\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t} else if ( config == 12 ) {\n\t\tn = 4;\n\t\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\n\t\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\n\t} else if ( config == 13 ) {\n\t\tn = 5;\n\t\tL[4] = L[3];\n\t\tL[3] = L[2];\n\t\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t} else if ( config == 14 ) {\n\t\tn = 5;\n\t\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t} else if ( config == 15 ) {\n\t\tn = 4;\n\t}\n\tif ( n == 3 )\n\t\tL[3] = L[0];\n\tif ( n == 4 )\n\t\tL[4] = L[0];\n}\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\n\tfloat cosTheta = dot( v1, v2 );\n\tfloat theta = acos( cosTheta );\n\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\n\treturn res;\n}\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\n\trectPoints[0] = pos - halfWidth - halfHeight;\n\trectPoints[1] = pos + halfWidth - halfHeight;\n\trectPoints[2] = pos + halfWidth + halfHeight;\n\trectPoints[3] = pos - halfWidth + halfHeight;\n}\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 P = geometry.position;\n\tvec3 T1, T2;\n\tT1 = normalize(V - N * dot( V, N ));\n\tT2 = - cross( N, T1 );\n\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\n\tvec3 clippedRect[5];\n\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\n\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\n\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\n\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\n\tint n;\n\tclipQuadToHorizon(clippedRect, n);\n\tif ( n == 0 )\n\t\treturn vec3( 0, 0, 0 );\n\tclippedRect[0] = normalize( clippedRect[0] );\n\tclippedRect[1] = normalize( clippedRect[1] );\n\tclippedRect[2] = normalize( clippedRect[2] );\n\tclippedRect[3] = normalize( clippedRect[3] );\n\tclippedRect[4] = normalize( clippedRect[4] );\n\tfloat sum = 0.0;\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\n\tif (n >= 4)\n\t\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\n\tif (n == 5)\n\t\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\n\tsum = max( 0.0, sum );\n\tvec3 Lo_i = vec3( sum, sum, sum );\n\treturn Lo_i;\n}\nvec3 Rect_Area_Light_Specular_Reflectance(\n\t\tconst in GeometricContext geometry,\n\t\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\n\t\tconst in float roughness,\n\t\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\n\tvec3 rectPoints[4];\n\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\n\tvec2 uv = ltcTextureCoords( geometry, roughness );\n\tvec4 brdfLtcApproxParams, t;\n\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\n\tt = texture2D( ltcMat, uv );\n\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\n\tmat3 brdfLtcApproxMat = mat3(\n\t\tvec3( 1, 0, t.y ),\n\t\tvec3( 0, t.z, 0 ),\n\t\tvec3( t.w, 0, t.x )\n\t);\n\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\n\tspecularReflectance *= brdfLtcScalar;\n\treturn specularReflectance;\n}\nvec3 Rect_Area_Light_Diffuse_Reflectance(\n\t\tconst in GeometricContext geometry,\n\t\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\n\tvec3 rectPoints[4];\n\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\n\tmat3 diffuseBrdfMat = mat3(1);\n\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\n\treturn diffuseReflectance;\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"; + + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = 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"; + + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n"; + + var 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"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n"; + + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; + + var defaultnormal_vertex = "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n"; + + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, 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#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; + + var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\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"; + + var 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"; + + var 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"; + + var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif"; + + var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n"; + + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; + + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n"; + + var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = 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"; + + var 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\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var 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};\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 matDiffColor = material.diffuseColor;\n\t\tvec3 matSpecColor = material.specularColor;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n\t\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\n\t\t\t\tgeometry,\n\t\t\t\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\n\t\t\t\troughness,\n\t\t\t\tltcMat, ltcMag );\n\t\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\n\t\t\t\tgeometry,\n\t\t\t\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\n\t\treflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\n\t\treflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\n\t}\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; + + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; + + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 matDiffColor = material.diffuseColor;\n\t\tvec3 matSpecColor = material.specularColor;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\n\t\t\t\tgeometry,\n\t\t\t\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\n\t\t\t\troughness,\n\t\t\t\tltcMat, ltcMag );\n\t\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\n\t\t\t\tgeometry,\n\t\t\t\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\n\t\treflectedLight.directSpecular += lightColor * matSpecColor * spec;\n\t\treflectedLight.directDiffuse += lightColor * matDiffColor * diff;\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n"; + + var 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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#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\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; + + var logdepthbuf_fragment = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var 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"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var normal_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n"; + + var 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 ) * flipNormal;\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"; + + var 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"; + + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var 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"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var 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"; + + var 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"; + + var 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"; + + var 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"; + + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform 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"; + + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n"; + + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; + + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var tonemapping_pars_fragment = "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n"; + + var 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"; + + var 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"; + + var 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"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var 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"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \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"; + + var 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"; + + var 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"; + + var 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"; + + var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\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}\n"; + + var equirect_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var 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\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \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\t#include \n}\n"; + + var 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 \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\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"; + + var 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 \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\t#include \n}\n"; + + var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\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\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"; + + var 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 \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"; + + var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; + + var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \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"; + + var points_vert = "uniform float size;\nuniform float scale;\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#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\t#include \n}\n"; + + var shadow_frag = "uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n"; + + var shadow_vert = "#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars: lights_pars, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_template: lights_template, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_flip: normal_flip, + normal_fragment: normal_fragment, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Color.prototype = { + + constructor: Color, + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( optionalTarget ) { + + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + hsl.h = hue; + hsl.s = saturation; + hsl.l = lightness; + + return hsl; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function ( h, s, l ) { + + var hsl = this.getHSL(); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }, + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + }; + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }, + + specularMap: { value: null }, + alphaMap: { value: null }, + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + equirect: { + + uniforms: { + tEquirect: { value: null }, + tFlip: { value: - 1 } + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: { + lightPos: { value: new Vector3() } + }, + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Box2.prototype = { + + constructor: Box2, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector2(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlarePlugin( renderer, flares ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var shader, program, attributes, uniforms; + + var tempTexture, occlusionTexture; + + function init() { + + var vertices = new Float32Array( [ + - 1, - 1, 0, 0, + 1, - 1, 1, 0, + 1, 1, 1, 1, + - 1, 1, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + // buffers + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + // textures + + tempTexture = gl.createTexture(); + occlusionTexture = gl.createTexture(); + + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "uniform sampler2D occlusionMap;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", + + "vVisibility = visibility.r / 9.0;", + "vVisibility *= 1.0 - visibility.g / 9.0;", + "vVisibility *= visibility.b / 9.0;", + "vVisibility *= 1.0 - visibility.a / 9.0;", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * vVisibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + program = createProgram( shader ); + + attributes = { + vertex: gl.getAttribLocation ( program, "position" ), + uv: gl.getAttribLocation ( program, "uv" ) + }; + + uniforms = { + renderType: gl.getUniformLocation( program, "renderType" ), + map: gl.getUniformLocation( program, "map" ), + occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), + opacity: gl.getUniformLocation( program, "opacity" ), + color: gl.getUniformLocation( program, "color" ), + scale: gl.getUniformLocation( program, "scale" ), + rotation: gl.getUniformLocation( program, "rotation" ), + screenPosition: gl.getUniformLocation( program, "screenPosition" ) + }; + + } + + /* + * Render lens flares + * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, + * reads these back and calculates occlusion. + */ + + this.render = function ( scene, camera, viewport ) { + + if ( flares.length === 0 ) return; + + var tempPosition = new Vector3(); + + var invAspect = viewport.w / viewport.z, + halfViewportWidth = viewport.z * 0.5, + halfViewportHeight = viewport.w * 0.5; + + var size = 16 / viewport.w, + scale = new Vector2( size * invAspect, size ); + + var screenPosition = new Vector3( 1, 1, 0 ), + screenPositionPixels = new Vector2( 1, 1 ); + + var validArea = new Box2(); + + validArea.min.set( viewport.x, viewport.y ); + validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) ); + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.vertex ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + // loop through all lens flares to update their occlusion and positions + // setup gl and common used attribs/uniforms + + gl.uniform1i( uniforms.occlusionMap, 0 ); + gl.uniform1i( uniforms.map, 1 ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + state.disable( gl.CULL_FACE ); + state.setDepthWrite( false ); + + for ( var i = 0, l = flares.length; i < l; i ++ ) { + + size = 16 / viewport.w; + scale.set( size * invAspect, size ); + + // calc object screen position + + var flare = flares[ i ]; + + tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); + + tempPosition.applyMatrix4( camera.matrixWorldInverse ); + tempPosition.applyMatrix4( camera.projectionMatrix ); + + // setup arrays for gl programs + + screenPosition.copy( tempPosition ); + + // horizontal and vertical coordinate of the lower left corner of the pixels to copy + + screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8; + screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8; + + // screen cull + + if ( validArea.containsPoint( screenPositionPixels ) === true ) { + + // save current RGB to temp texture + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, null ); + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // render pink quad + + gl.uniform1i( uniforms.renderType, 0 ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + + state.disable( gl.BLEND ); + state.enable( gl.DEPTH_TEST ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // copy result to occlusionMap + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // restore graphics + + gl.uniform1i( uniforms.renderType, 1 ); + state.disable( gl.DEPTH_TEST ); + + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // update object positions + + flare.positionScreen.copy( screenPosition ); + + if ( flare.customUpdateCallback ) { + + flare.customUpdateCallback( flare ); + + } else { + + flare.updateLensFlares(); + + } + + // render flares + + gl.uniform1i( uniforms.renderType, 2 ); + state.enable( gl.BLEND ); + + for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { + + var sprite = flare.lensFlares[ j ]; + + if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { + + screenPosition.x = sprite.x; + screenPosition.y = sprite.y; + screenPosition.z = sprite.z; + + size = sprite.size * sprite.scale / viewport.w; + + scale.x = size * invAspect; + scale.y = size; + + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform1f( uniforms.rotation, sprite.rotation ); + + gl.uniform1f( uniforms.opacity, sprite.opacity ); + gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); + + state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); + renderer.setTexture2D( sprite.texture, 1 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + } + + } + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + state.enable( gl.DEPTH_TEST ); + state.setDepthWrite( true ); + + renderer.resetGLState(); + + }; + + function createProgram( shader ) { + + var program = gl.createProgram(); + + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + + var prefix = "precision " + renderer.getPrecision() + " float;\n"; + + gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); + gl.shaderSource( vertexShader, prefix + shader.vertexShader ); + + gl.compileShader( fragmentShader ); + gl.compileShader( vertexShader ); + + gl.attachShader( program, fragmentShader ); + gl.attachShader( program, vertexShader ); + + gl.linkProgram( program ); + + return program; + + } + + } + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function SpritePlugin( renderer, sprites ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new Vector3(); + var spriteRotation = new Quaternion(); + var spriteScale = new Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation ( program, 'position' ), + uv: gl.getAttribLocation ( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new Texture( canvas ); + texture.needsUpdate = true; + + } + + this.render = function ( scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( fog.isFog ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( fog.isFogExp2 ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + if ( material.visible === false ) continue; + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + + if ( material.map ) { + + renderer.setTexture2D( material.map, 0 ); + + } else { + + renderer.setTexture2D( texture, 0 ); + + } + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + renderer.resetGLState(); + + }; + + function createProgram() { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vUV = uvOffset + uv * uvScale;', + + 'vec2 alignedPosition = position * scale;', + + 'vec2 rotatedPosition;', + 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + 'vec4 finalPosition;', + + 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + 'finalPosition.xy += rotatedPosition;', + 'finalPosition = projectionMatrix * finalPosition;', + + 'gl_Position = finalPosition;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vec4 texture = texture2D( map, vUV );', + + 'if ( texture.a < alphaTest ) discard;', + + 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + 'if ( fogType > 0 ) {', + + 'float depth = gl_FragCoord.z / gl_FragCoord.w;', + 'float fogFactor = 0.0;', + + 'if ( fogType == 1 ) {', + + 'fogFactor = smoothstep( fogNear, fogFar, depth );', + + '} else {', + + 'const float LOG2 = 1.442695;', + 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', + 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + '}', + + 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', + + '}', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0; + + function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this._needsUpdate = true; + + } + + Material.prototype = { + + constructor: Material, + + isMaterial: true, + + get needsUpdate() { + + return this._needsUpdate; + + }, + + set needsUpdate( value ) { + + if ( value === true ) this.update(); + this._needsUpdate = value; + + }, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = meta === undefined; + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.4, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale.toArray(); + + } + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.shading !== SmoothShading ) data.shading = this.shading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + data.skinning = this.skinning; + data.morphTargets = this.morphTargets; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.shading = source.shading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.alphaTest = source.alphaTest; + + this.premultipliedAlpha = source.premultipliedAlpha; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + return this; + + }, + + update: function () { + + this.dispatchEvent( { type: 'update' } ); + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + }; + + Object.assign( Material.prototype, EventDispatcher.prototype ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = source.defines; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Box3.prototype = { + + constructor: Box3, + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var v1 = new Vector3(); + + return function expandByObject( object ) { + + var scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( function ( node ) { + + var i, l; + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } ); + + return this; + + }; + + }(), + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector3(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint; + + return function intersectsSphere( sphere ) { + + if ( closestPoint === undefined ) closestPoint = new Vector3(); + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= plane.constant && max >= plane.constant ); + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( optionalTarget ) { + + var result = optionalTarget || new Sphere(); + + this.getCenter( result.center ); + + result.radius = this.getSize( v1 ).length() * 0.5; + + return result; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + }; + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Sphere.prototype = { + + constructor: Sphere, + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box; + + return function setFromPoints( points, optionalCenter ) { + + if ( box === undefined ) box = new Box3(); // see #10547 + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + // We use the following equation to compute the signed distance from + // the center of the sphere to the plane. + // + // distance = q * n - d + // + // If this distance is greater than the radius of the sphere, + // then there is no intersection. + + return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + var result = optionalTarget || new Vector3(); + + result.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + result.sub( this.center ).normalize(); + result.multiplyScalar( this.radius ).add( this.center ); + + } + + return result; + + }, + + getBoundingBox: function ( optionalTarget ) { + + var box = optionalTarget || new Box3(); + + box.set( this.center, this.center ); + box.expandByScalar( this.radius ); + + return box; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = new Float32Array( [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Matrix3.prototype = { + + constructor: Matrix3, + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 3 ], me[ 6 ], + me[ 1 ], me[ 4 ], me[ 7 ], + me[ 2 ], me[ 5 ], me[ 8 ] + + ); + + return this; + + }, + + setFromMatrix4: function( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1; + + return function applyToBufferAttribute( attribute ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Plane.prototype = { + + constructor: Plane, + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, optionalTarget ) { + + return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); + + }, + + orthoPoint: function ( point, optionalTarget ) { + + var perpendicularMagnitude = this.distanceToPoint( point ); + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return result.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return result.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + // transform normal based on theory here: + // http://www.songho.ca/opengl/gl_normaltransform.html + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + // recalculate constant (like in setFromNormalAndCoplanarPoint) + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant = this.constant - offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Frustum.prototype = { + + constructor: Frustum, + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new Vector3(), + p2 = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6 ; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { + + var _gl = _renderer.context, + _state = _renderer.state, + _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _lightShadows = _lights.shadows, + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _renderList = [], + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + var depthMaterialTemplate = new MeshDepthMaterial(); + depthMaterialTemplate.depthPacking = RGBADepthPacking; + depthMaterialTemplate.clipping = true; + + var distanceShader = ShaderLib[ "distanceRGBA" ]; + var distanceUniforms = UniformsUtils.clone( distanceShader.uniforms ); + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = depthMaterialTemplate.clone(); + depthMaterial.morphTargets = useMorphing; + depthMaterial.skinning = useSkinning; + + _depthMaterials[ i ] = depthMaterial; + + var distanceMaterial = new ShaderMaterial( { + defines: { + 'USE_SHADOWMAP': '' + }, + uniforms: distanceUniforms, + vertexShader: distanceShader.vertexShader, + fragmentShader: distanceShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning, + clipping: true + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.renderReverseSided = true; + this.renderSingleSided = true; + + this.render = function ( scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( _lightShadows.length === 0 ) return; + + // Set GL state for depth map. + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.disable( _gl.BLEND ); + _state.setDepthTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount, isPointLight; + + for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) { + + var light = _lightShadows[ i ]; + var shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( light && light.isPointLight ) { + + faceCount = 6; + isPointLight = true; + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } else { + + faceCount = 1; + isPointLight = false; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + // TODO (abelnation / sam-g-steel): is this needed? + if (shadow && shadow.isRectAreaLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } else { + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + + } + + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + _renderList.length = 0; + + projectObject( scene, camera, shadowCamera ); + + // render shadow map + // render regular objects + + for ( var j = 0, jl = _renderList.length; j < jl; j ++ ) { + + var object = _renderList[ j ]; + var geometry = _objects.update( object ); + var material = object.material; + + if ( material && material.isMultiMaterial ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + } + + // Restore GL state. + var clearColor = _renderer.getClearColor(), + clearAlpha = _renderer.getClearAlpha(); + _renderer.setClearColor( clearColor, clearAlpha ); + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + var side = material.side; + + if ( scope.renderSingleSided && side == DoubleSide ) { + + side = FrontSide; + + } + + if ( scope.renderReverseSided ) { + + if ( side === FrontSide ) side = BackSide; + else if ( side === BackSide ) side = FrontSide; + + } + + result.side = side; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.uniforms.lightPos !== undefined ) { + + result.uniforms.lightPos.value.copy( lightPositionWorld ); + + } + + return result; + + } + + function projectObject( object, camera, shadowCamera ) { + + if ( object.visible === false ) return; + + var visible = ( object.layers.mask & camera.layers.mask ) !== 0; + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) { + + var material = object.material; + + if ( material.visible === true ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + _renderList.push( object ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, shadowCamera ); + + } + + } + + } + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Ray.prototype = { + + constructor: Ray, + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + result.subVectors( point, this.origin ); + var directionDistance = result.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return result.copy( this.origin ); + + } + + return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, optionalTarget ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, optionalTarget ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, optionalTarget ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, optionalTarget ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, optionalTarget ); + + }, + + + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, optionalTarget ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, optionalTarget ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.direction.add( this.origin ).applyMatrix4( matrix4 ); + this.origin.applyMatrix4( matrix4 ); + this.direction.sub( this.origin ); + this.direction.normalize(); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Euler.prototype = { + + constructor: Euler, + + isEuler: true, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get order () { + + return this._order; + + }, + + set order ( value ) { + + this._order = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix; + + return function setFromQuaternion( q, order, update ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1; + + } + + Layers.prototype = { + + constructor: Layers, + + set: function ( channel ) { + + this.mask = 1 << channel; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0; + + function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + this.onBeforeRender = function () {}; + this.onAfterRender = function () {}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object3D.prototype = { + + constructor: Object3D, + + isObject3D: true, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This routine does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + m1.lookAt( vector, this.position, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + return result.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( optionalTarget ) { + + var result = optionalTarget || new Quaternion(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, result, scale ); + + return result; + + }; + + }(), + + getWorldRotation: function () { + + var quaternion = new Quaternion(); + + return function getWorldRotation( optionalTarget ) { + + var result = optionalTarget || new Euler(); + + this.getWorldQuaternion( quaternion ); + + return result.setFromQuaternion( quaternion, this.rotation.order, false ); + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, result ); + + return result; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate === true ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate === true || force === true ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + // meta is '' when called from JSON.stringify + var isRootObject = ( meta === undefined || meta === '' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {} + }; + + output.metadata = { + version: 4.4, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + + object.matrix = this.matrix.toArray(); + + // + + if ( this.geometry !== undefined ) { + + if ( meta.geometries[ this.geometry.uuid ] === undefined ) { + + meta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta ); + + } + + object.geometry = this.geometry.uuid; + + } + + if ( this.material !== undefined ) { + + if ( meta.materials[ this.material.uuid ] === undefined ) { + + meta.materials[ this.material.uuid ] = this.material.toJSON( meta ); + + } + + object.material = this.material.uuid; + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + }; + + Object.assign( Object3D.prototype, EventDispatcher.prototype ); + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Line3.prototype = { + + constructor: Line3, + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, optionalTarget ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + }; + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Triangle.normal = function () { + + var v0 = new Vector3(); + + return function normal( a, b, c, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + result.subVectors( c, b ); + v0.subVectors( a, b ); + result.cross( v0 ); + + var resultLengthSq = result.lengthSq(); + if ( resultLengthSq > 0 ) { + + return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); + + } + + return result.set( 0, 0, 0 ); + + }; + + }(); + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + Triangle.barycoordFromPoint = function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function barycoordFromPoint( point, a, b, c, optionalTarget ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + var result = optionalTarget || new Vector3(); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return result.set( 1 - u - v, v, u ); + + }; + + }(); + + Triangle.containsPoint = function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + var result = Triangle.barycoordFromPoint( point, a, b, c, v1 ); + + return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); + + }; + + }(); + + Triangle.prototype = { + + constructor: Triangle, + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + area: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function area() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + midpoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + normal: function ( optionalTarget ) { + + return Triangle.normal( this.a, this.b, this.c, optionalTarget ); + + }, + + plane: function ( optionalTarget ) { + + var result = optionalTarget || new Plane(); + + return result.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + barycoordFromPoint: function ( point, optionalTarget ) { + + return Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + closestPointToPoint: function () { + + var plane, edgeList, projectedPoint, closestPoint; + + return function closestPointToPoint( point, optionalTarget ) { + + if ( plane === undefined ) { + + plane = new Plane(); + edgeList = [ new Line3(), new Line3(), new Line3() ]; + projectedPoint = new Vector3(); + closestPoint = new Vector3(); + + } + + var result = optionalTarget || new Vector3(); + var minDistance = Infinity; + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints( this.a, this.b, this.c ); + plane.projectPoint( point, projectedPoint ); + + // check if the projection lies within the triangle + + if( this.containsPoint( projectedPoint ) === true ) { + + // if so, this is the closest point + + result.copy( projectedPoint ); + + } else { + + // if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices + + edgeList[ 0 ].set( this.a, this.b ); + edgeList[ 1 ].set( this.b, this.c ); + edgeList[ 2 ].set( this.c, this.a ); + + for( var i = 0; i < edgeList.length; i ++ ) { + + edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); + + var distance = projectedPoint.distanceToSquared( closestPoint ); + + if( distance < minDistance ) { + + minDistance = distance; + + result.copy( closestPoint ); + + } + + } + + } + + return result; + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = (normal && normal.isVector3) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = (color && color.isColor) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Face3.prototype = { + + constructor: Face3, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * shading: THREE.SmoothShading, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.onUploadCallback = function () {}; + + this.version = 0; + + } + + BufferAttribute.prototype = { + + constructor: BufferAttribute, + + isBufferAttribute: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyIndicesArray: function ( indices ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + var index = indices[ i ]; + + array[ offset ++ ] = index.a; + array[ offset ++ ] = index.b; + array[ offset ++ ] = index.c; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + }; + + // + + function Int8BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize ); + + } + + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + + function Uint8BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize ); + + } + + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + + function Uint8ClampedBufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize ); + + } + + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + + function Int16BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize ); + + } + + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + + function Uint16BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize ); + + } + + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + + function Int32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize ); + + } + + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + + function Uint32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize ); + + } + + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + + function Float32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize ); + + } + + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + + function Float64BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + this.indices = []; + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + + } ); + + // http://stackoverflow.com/questions/1669190/javascript-min-max-array-values/13440842#13440842 + + function arrayMax( array ) { + + var length = array.length, max = - Infinity; + + while ( length -- ) { + + if ( array[ length ] > max ) { + + max = array[ length ]; + + } + + } + + return max; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var count = 0; + function GeometryIdCount() { return count++; } + + function Geometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Geometry.prototype = { + + constructor: Geometry, + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + } + + if ( indices !== undefined ) { + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } + + } + + } else { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeLineDistances: function () { + + var d = 0; + var vertices = this.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + if ( i > 0 ) { + + d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); + + } + + this.lineDistances[ i ] = d; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ( geometry && geometry.isGeometry ) === false ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ( mesh && mesh.isMesh ) === false ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + mesh.matrixAutoUpdate && mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + }; + + Object.assign( Geometry.prototype, EventDispatcher.prototype ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + } + + BufferGeometry.prototype = { + + constructor: BufferGeometry, + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + if ( geometry.indices.length > 0 ) { + + var TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array; + var indices = new TypeArray( geometry.indices.length * 3 ); + this.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ( geometry && geometry.isBufferGeometry ) === false ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) offset = 0; + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var normals = this.attributes.normal.array; + + var x, y, z, n; + + for ( var i = 0, il = normals.length; i < il; i += 3 ) { + + x = normals[ i ]; + y = normals[ i + 1 ]; + z = normals[ i + 2 ]; + + n = 1.0 / Math.sqrt( x * x + y * y + z * z ); + + normals[ i ] *= n; + normals[ i + 1 ] *= n; + normals[ i + 2 ] *= n; + + } + + }, + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + }; + + BufferGeometry.MaxIndex = 65535; + + Object.assign( BufferGeometry.prototype, EventDispatcher.prototype ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + return this; + + }, + + updateMorphTargets: function () { + + var morphTargets = this.geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ morphTargets[ m ].name ] = m; + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var barycoord = new Vector3(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + var material = object.material; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + intersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) ); + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var i, l; + + if ( index !== null ) { + + // indexed buffer geometry + + for ( i = 0, l = index.count; i < l; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else { + + // non-indexed buffer geometry + + for ( i = 0, l = position.count; i < l; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.index = a; // triangle number in positions buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isFaceMaterial = ( material && material.isMultiMaterial ); + var materials = isFaceMaterial === true ? material.materials : null; + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as + */ + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + + } + + Camera.prototype = Object.create( Object3D.prototype ); + Camera.prototype.constructor = Camera; + + Camera.prototype.isCamera = true; + + Camera.prototype.getWorldDirection = function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + + }(); + + Camera.prototype.lookAt = function () { + + // This routine does not support cameras with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + m1.lookAt( this.position, vector, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(); + + Camera.prototype.clone = function () { + + return new this.constructor().copy( this ); + + }; + + Camera.prototype.copy = function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( + _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( view !== null ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function( fullWidth, fullHeight, x, y, width, height ) { + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, size; + + function setIndex( index ) { + + if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { + + type = gl.UNSIGNED_INT; + size = 4; + + } else if ( index.array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + size = 2; + + } else { + + type = gl.UNSIGNED_BYTE; + size = 1; + + } + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * size ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount ); + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + return { + + setMode: setMode, + setIndex: setIndex, + render: render, + renderInstances: renderInstances + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + var count = 0; + + if ( position.isInterleavedBufferAttribute ) { + + count = position.data.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } else { + + count = position.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + return { + setMode: setMode, + render: render, + renderInstances: renderInstances + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLLights() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear','( value )' ]; + case sRGBEncoding: + return [ 'sRGB','( value )' ]; + case RGBEEncoding: + return [ 'RGBE','( value )' ]; + case RGBM7Encoding: + return [ 'RGBM','( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM','( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD','( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }"; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }"; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = "Linear"; + break; + + case ReinhardToneMapping: + toneMappingName = "Reinhard"; + break; + + case Uncharted2ToneMapping: + toneMappingName = "Uncharted2"; + break; + + case CineonToneMapping: + toneMappingName = "OptimizedCineon"; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program, identifiers ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function parseIncludes( string ) { + + var pattern = /#include +<([\w\d.]+)>/g; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, code, material, parameters ) { + + var gl = renderer.context; + + var extensions = material.extensions; + var defines = material.defines; + + var vertexShader = material.__webglShader.vertexShader; + var fragmentShader = material.__webglShader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions( extensions, parameters, renderer.extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } else { + + prefixVertex = [ + + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + '#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection), + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '', + + parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '', + + parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader, parameters ); + vertexShader = replaceLightNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader, parameters ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + + if ( ! material.isShaderMaterial ) { + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ); + var vertexLog = gl.getShaderInfoLog( glVertexShader ); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function() { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = + new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function() { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function() { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking" + ]; + + + function allocateBones( object ) { + + if ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = nVertexMatrices; + + if ( object !== undefined && (object && object.isSkinnedMesh) ) { + + maxBones = Math.min( object.skeleton.bones.length, maxBones ); + + if ( maxBones < object.skeleton.bones.length ) { + + console.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' ); + + } + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = allocateBones( object ); + var precision = renderer.getPrecision(); + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getCurrentRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: (fog && fog.isFogExp2), + + flatShading: material.shading === FlatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + return array.join(); + + }; + + this.acquireProgram = function ( material, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, code, material, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, properties, info ) { + + var geometries = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + deleteAttribute( buffergeometry.index ); + + } + + deleteAttributes( buffergeometry.attributes ); + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + // TODO + + var property = properties.get( geometry ); + + if ( property.wireframe ) { + + deleteAttribute( property.wireframe ); + + } + + properties.delete( geometry ); + + var bufferproperty = properties.get( buffergeometry ); + + if ( bufferproperty.wireframe ) { + + deleteAttribute( bufferproperty.wireframe ); + + } + + properties.delete( buffergeometry ); + + // + + info.memory.geometries --; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function deleteAttribute( attribute ) { + + var buffer = getAttributeBuffer( attribute ); + + if ( buffer !== undefined ) { + + gl.deleteBuffer( buffer ); + removeAttributeBuffer( attribute ); + + } + + } + + function deleteAttributes( attributes ) { + + for ( var name in attributes ) { + + deleteAttribute( attributes[ name ] ); + + } + + } + + function removeAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + properties.delete( attribute.data ); + + } else { + + properties.delete( attribute ); + + } + + } + + return { + + get: function ( object ) { + + var geometry = object.geometry; + + if ( geometries[ geometry.id ] !== undefined ) { + + return geometries[ geometry.id ]; + + } + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + var buffergeometry; + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( gl, properties, info ) { + + var geometries = new WebGLGeometries( gl, properties, info ); + + // + + function update( object ) { + + // TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter. + + var geometry = geometries.get( object ); + + if ( object.geometry.isGeometry ) { + + geometry.updateFromObject( object ); + + } + + var index = geometry.index; + var attributes = geometry.attributes; + + if ( index !== null ) { + + updateAttribute( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in attributes ) { + + updateAttribute( attributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + updateAttribute( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + return geometry; + + } + + function updateAttribute( attribute, bufferType ) { + + var data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute; + + var attributeProperties = properties.get( data ); + + if ( attributeProperties.__webglBuffer === undefined ) { + + createBuffer( attributeProperties, data, bufferType ); + + } else if ( attributeProperties.version !== data.version ) { + + updateBuffer( attributeProperties, data, bufferType ); + + } + + } + + function createBuffer( attributeProperties, data, bufferType ) { + + attributeProperties.__webglBuffer = gl.createBuffer(); + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + var usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + gl.bufferData( bufferType, data.array, usage ); + + var type = gl.FLOAT; + var array = data.array; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( "Unsupported data buffer format: Float64Array" ); + + } else if ( array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + + } else if ( array instanceof Int16Array ) { + + type = gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = gl.UNSIGNED_BYTE; + + } + + attributeProperties.bytesPerElement = array.BYTES_PER_ELEMENT; + attributeProperties.type = type; + attributeProperties.version = data.version; + + data.onUploadCallback(); + + } + + function updateBuffer( attributeProperties, data, bufferType ) { + + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + if ( data.dynamic === false ) { + + gl.bufferData( bufferType, data.array, gl.STATIC_DRAW ); + + } else if ( data.updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, data.array ); + + } else if ( data.updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT, + data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) ); + + data.updateRange.count = 0; // reset range + + } + + attributeProperties.version = data.version; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function getAttributeProperties( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + return properties.get( attribute.data ); + + } + + return properties.get( attribute ); + + } + + function getWireframeAttribute( geometry ) { + + var property = properties.get( geometry ); + + if ( property.wireframe !== undefined ) { + + return property.wireframe; + + } + + var indices = []; + + var index = geometry.index; + var attributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( index !== null ) { + + var array = index.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = attributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + var attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + updateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + property.wireframe = attribute; + + return attribute; + + } + + return { + + getAttributeBuffer: getAttributeBuffer, + getAttributeProperties: getAttributeProperties, + getWireframeAttribute: getWireframeAttribute, + + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) { + + var _infoMemory = info.memory; + var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = _Math.nearestPowerOfTwo( image.width ); + canvas.height = _Math.nearestPowerOfTwo( image.height ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + _infoMemory.textures --; + + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + _infoMemory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.delete( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.delete( renderTarget.texture ); + properties.delete( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) { + + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0'); + internalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( _isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16; + + } + + if ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = paramThreeToGL( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + internalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = paramThreeToGL( texture.type ); + + } + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = paramThreeToGL( renderTarget.texture.format ); + var glType = paramThreeToGL( renderTarget.texture.type ); + state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!'); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture'); + + } + + // upload an empty depth texture with framebuffer size + if ( !properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error('Unknown depthTexture format') + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets'); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + + if ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) && + texture.minFilter !== NearestFilter && + texture.minFilter !== LinearFilter ) { + + var target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + _gl.generateMipmap( target ); + state.bindTexture( target, null ); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = {}; + + return { + + get: function ( object ) { + + var uuid = object.uuid; + var map = properties[ uuid ]; + + if ( map === undefined ) { + + map = {}; + properties[ uuid ] = map; + + } + + return map; + + }, + + delete: function ( object ) { + + delete properties[ object.uuid ]; + + }, + + clear: function () { + + properties = {}; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, paramThreeToGL ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4(); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( 0, 0, 0, 1 ); + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var currentScissorTest = null; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + + var version = parseFloat( /^WebGL\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] ); + var lineWidthAvailable = parseFloat( version ) >= 1.0; + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // + + function init() { + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + setDepthFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + enable( gl.BLEND ); + setBlending( NormalBlending ); + + } + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending !== NoBlending ) { + + enable( gl.BLEND ); + + } else { + + disable( gl.BLEND ); + + } + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( blending === AdditiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } + + } else if ( blending === SubtractiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } + + } else if ( blending === MultiplyBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } + + } else { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + } + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + if ( blending === CustomBlending ) { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } else { + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } + + } + + // TODO Deprecate + + function setColorWrite( colorWrite ) { + + colorBuffer.setMask( colorWrite ); + + } + + function setDepthTest( depthTest ) { + + depthBuffer.setTest( depthTest ); + + } + + function setDepthWrite( depthWrite ) { + + depthBuffer.setMask( depthWrite ); + + } + + function setDepthFunc( depthFunc ) { + + depthBuffer.setFunc( depthFunc ); + + } + + function setStencilTest( stencilTest ) { + + stencilBuffer.setTest( stencilTest ); + + } + + function setStencilWrite( stencilWrite ) { + + stencilBuffer.setMask( stencilWrite ); + + } + + function setStencilFunc( stencilFunc, stencilRef, stencilMask ) { + + stencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask ); + + } + + function setStencilOp( stencilFail, stencilZFail, stencilZPass ) { + + stencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function getScissorTest() { + + return currentScissorTest; + + } + + function setScissorTest( scissorTest ) { + + currentScissorTest = scissorTest; + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + init: init, + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + setBlending: setBlending, + + setColorWrite: setColorWrite, + setDepthTest: setDepthTest, + setDepthWrite: setDepthWrite, + setDepthFunc: setDepthFunc, + setStencilTest: setStencilTest, + setStencilWrite: setStencilWrite, + setStencilFunc: setStencilFunc, + setStencilOp: setStencilOp, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + getScissorTest: getScissorTest, + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' ); + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + case 'WEBGL_compressed_texture_etc1': + extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function() { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function() { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || + planes === null || planes.length === 0 || + renderingShadows && ! clipShadows ) { + // there's no local clipping + + if ( renderingShadows ) { + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; + i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ). + applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false; + + var lights = []; + + var opaqueObjects = []; + var opaqueObjectsLastIndex = - 1; + var transparentObjects = []; + var transparentObjectsLastIndex = - 1; + + var morphInfluences = new Float32Array( 8 ); + + var sprites = []; + var lensFlares = []; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + // internal state cache + + _currentProgram = null, + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + _currentCamera = null, + + _currentScissor = new Vector4(), + _currentScissorTest = null, + + _currentViewport = new Vector4(), + + // + + _usedTextureUnits = 0, + + // + + _clearColor = new Color( 0x000000 ), + _clearAlpha = 0, + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + _viewport = new Vector4( 0, 0, _width, _height ), + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + _sphere = new Sphere(), + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(), + _matrix4 = new Matrix4(), + _matrix42 = new Matrix4(), + + // light arrays cache + + _lights = { + + hash: '', + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + + shadows: [] + + }, + + // info + + _infoRender = { + + calls: 0, + vertices: 0, + faces: 0, + points: 0 + + }; + + this.info = { + + render: _infoRender, + memory: { + + geometries: 0, + textures: 0 + + }, + programs: null + + }; + + + // initialize + + var _gl; + + try { + + var attributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer + }; + + _gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw 'Error creating WebGL context with your selected attributes.'; + + } else { + + throw 'Error creating WebGL context.'; + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error ); + + } + + var extensions = new WebGLExtensions( _gl ); + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extensions.get( 'OES_element_index_uint' ) ) { + + BufferGeometry.MaxIndex = 4294967296; + + } + + var capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + var state = new WebGLState( _gl, extensions, paramThreeToGL ); + var properties = new WebGLProperties(); + var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info ); + var objects = new WebGLObjects( _gl, properties, this.info ); + var programCache = new WebGLPrograms( this, capabilities ); + var lightCache = new WebGLLights(); + + this.info.programs = programCache.programs; + + var bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender ); + var indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ); + + // + + var backgroundPlaneCamera, backgroundPlaneMesh; + var backgroundBoxCamera, backgroundBoxMesh; + + // + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + function setDefaultGLState() { + + state.init(); + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + } + + function resetGLState() { + + _currentProgram = null; + _currentCamera = null; + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + + state.reset(); + + } + + setDefaultGLState(); + + this.context = _gl; + this.capabilities = capabilities; + this.extensions = extensions; + this.properties = properties; + this.state = state; + + // shadow map + + var shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities ); + + this.shadowMap = shadowMap; + + + // Plugins + + var spritePlugin = new SpritePlugin( this, sprites ); + var lensFlarePlugin = new LensFlarePlugin( this, lensFlares ); + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + extensions.get( 'WEBGL_lose_context' ).loseContext(); + + }; + + this.getMaxAnisotropy = function () { + + return capabilities.getMaxAnisotropy(); + + }; + + this.getPrecision = function () { + + return capabilities.precision; + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _viewport.z, _viewport.w, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + state.viewport( _viewport.set( x, y, width, height ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + state.scissor( _scissor.set( x, y, width, height ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return _clearColor; + + }; + + this.setClearColor = function ( color, alpha ) { + + _clearColor.set( color ); + + _clearAlpha = alpha !== undefined ? alpha : 1; + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + }; + + this.getClearAlpha = function () { + + return _clearAlpha; + + }; + + this.setClearAlpha = function ( alpha ) { + + _clearAlpha = alpha; + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // Reset + + this.resetGLState = resetGLState; + + this.dispose = function() { + + transparentObjects = []; + transparentObjectsLastIndex = -1; + opaqueObjects = []; + opaqueObjectsLastIndex = -1; + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + resetGLState(); + setDefaultGLState(); + + properties.clear(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.delete( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var attributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.position ); + _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( ! material.isMeshPhongMaterial && + ! material.isMeshStandardMaterial && + ! material.isMeshNormalMaterial && + material.shading === FlatShading ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.normal ); + + _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.uv ); + + _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.color ); + + _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + setMaterial( material ); + + var program = setProgram( camera, fog, material, object ); + + var updateBuffers = false; + var geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + var activeInfluences = []; + + for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { + + var influence = morphTargetInfluences[ i ]; + activeInfluences.push( [ influence, i ] ); + + } + + activeInfluences.sort( absNumericalSort ); + + if ( activeInfluences.length > 8 ) { + + activeInfluences.length = 8; + + } + + var morphAttributes = geometry.morphAttributes; + + for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var index = influence[ 1 ]; + + if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); + if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); + + } else { + + if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); + if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) { + + morphInfluences[ i ] = 0.0; + + } + + program.getUniforms().setValue( + _gl, 'morphTargetInfluences', morphInfluences ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = objects.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var renderer; + + if ( index !== null ) { + + renderer = indexedBufferRenderer; + renderer.setIndex( index ); + + } else { + + renderer = bufferRenderer; + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) ); + + } + + } + + // + + var dataCount = 0; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry, startIndex ) { + + var extension; + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + if ( startIndex === undefined ) startIndex = 0; + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attributeProperties = objects.getAttributeProperties( geometryAttribute ); + + var buffer = attributeProperties.__webglBuffer; + var type = attributeProperties.type; + var bytesPerElement = attributeProperties.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Sorting + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] ); + + } + + function painterSortStable( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) { + + return a.material.program.id - b.material.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + lights.length = 0; + + opaqueObjectsLastIndex = - 1; + transparentObjectsLastIndex = - 1; + + sprites.length = 0; + lensFlares.length = 0; + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + projectObject( scene, camera ); + + opaqueObjects.length = opaqueObjectsLastIndex + 1; + transparentObjects.length = transparentObjectsLastIndex + 1; + + if ( _this.sortObjects === true ) { + + opaqueObjects.sort( painterSortStable ); + transparentObjects.sort( reversePainterSortStable ); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + setupShadows( lights ); + + shadowMap.render( scene, camera ); + + setupLights( lights, camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + _infoRender.calls = 0; + _infoRender.vertices = 0; + _infoRender.faces = 0; + _infoRender.points = 0; + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + var background = scene.background; + + if ( background === null ) { + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + } else if ( background && background.isColor ) { + + state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha ); + forceClear = true; + + } + + if ( this.autoClear || forceClear ) { + + this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); + + } + + if ( background && background.isCubeTexture ) { + + if ( backgroundBoxCamera === undefined ) { + + backgroundBoxCamera = new PerspectiveCamera(); + + backgroundBoxMesh = new Mesh( + new BoxBufferGeometry( 5, 5, 5 ), + new ShaderMaterial( { + uniforms: ShaderLib.cube.uniforms, + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + } + + backgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix ); + + backgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld ); + backgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld ); + + + backgroundBoxMesh.material.uniforms[ "tCube" ].value = background; + backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld ); + + objects.update( backgroundBoxMesh ); + + _this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null ); + + } else if ( background && background.isTexture ) { + + if ( backgroundPlaneCamera === undefined ) { + + backgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + + backgroundPlaneMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } ) + ); + + } + + backgroundPlaneMesh.material.map = background; + + objects.update( backgroundPlaneMesh ); + + _this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null ); + + } + + // + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + state.setBlending( NoBlending ); + renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + renderObjects( transparentObjects, scene, camera ); + + } + + // custom render plugins (post pass) + + spritePlugin.render( scene, camera ); + lensFlarePlugin.render( scene, camera, _currentViewport ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.setDepthTest( true ); + state.setDepthWrite( true ); + state.setColorWrite( true ); + + // _gl.finish(); + + }; + + function pushRenderItem( object, geometry, material, z, group ) { + + var array, index; + + // allocate the next position in the appropriate array + + if ( material.transparent ) { + + array = transparentObjects; + index = ++ transparentObjectsLastIndex; + + } else { + + array = opaqueObjects; + index = ++ opaqueObjectsLastIndex; + + } + + // recycle existing render item or grow the array + + var renderItem = array[ index ]; + + if ( renderItem !== undefined ) { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.z = _vector3.z; + renderItem.group = group; + + } else { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + z: _vector3.z, + group: group + }; + + // assert( index === array.length ); + array.push( renderItem ); + + } + + } + + // TODO Duplicated code (Frustum) + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + + function projectObject( object, camera ) { + + if ( object.visible === false ) return; + + var visible = ( object.layers.mask & camera.layers.mask ) !== 0; + + if ( visible ) { + + if ( object.isLight ) { + + lights.push( object ); + + } else if ( object.isSprite ) { + + if ( object.frustumCulled === false || isSpriteViewable( object ) === true ) { + + sprites.push( object ); + + } + + } else if ( object.isLensFlare ) { + + lensFlares.push( object ); + + } else if ( object.isImmediateRenderObject ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyMatrix4( _projScreenMatrix ); + + } + + pushRenderItem( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( object.frustumCulled === false || isObjectViewable( object ) === true ) { + + var material = object.material; + + if ( material.visible === true ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + + if ( material.isMultiMaterial ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + pushRenderItem( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else { + + pushRenderItem( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + if ( object.isImmediateRenderObject ) { + + setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + + } + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var parameters = programCache.getParameters( + material, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.__webglShader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.__webglShader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.__webglShader = materialProperties.__webglShader; + + program = programCache.acquireProgram( material, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var attributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( attributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( attributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.__webglShader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + + materialProperties.lightsHash = _lights.hash; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = _lights.ambient; + uniforms.directionalLights.value = _lights.directional; + uniforms.spotLights.value = _lights.spot; + uniforms.rectAreaLights.value = _lights.rectArea; + uniforms.pointLights.value = _lights.point; + uniforms.hemisphereLights.value = _lights.hemi; + + uniforms.directionalShadowMap.value = _lights.directionalShadowMap; + uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix; + uniforms.spotShadowMap.value = _lights.spotShadowMap; + uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix; + uniforms.pointShadowMap.value = _lights.pointShadowMap; + uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setMaterial( material ) { + + material.side === DoubleSide + ? state.disable( _gl.CULL_FACE ) + : state.enable( _gl.CULL_FACE ); + + state.setFlipSided( material.side === BackSide ); + + material.transparent === true + ? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) + : state.setBlending( NoBlending ); + + state.setDepthFunc( material.depthFunc ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + state.setColorWrite( material.colorWrite ); + state.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.__webglShader.uniforms; + + if ( program.id !== _currentProgram ) { + + _gl.useProgram( program.program ); + _currentProgram = program.id; + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + p_uniforms.set( _gl, camera, 'projectionMatrix' ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + + if ( camera !== _currentCamera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + p_uniforms.set( _gl, _this, 'toneMappingExposure' ); + p_uniforms.set( _gl, _this, 'toneMappingWhitePoint' ); + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + if ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) { + + p_uniforms.set( _gl, skeleton, 'boneTexture' ); + p_uniforms.set( _gl, skeleton, 'boneTextureWidth' ); + p_uniforms.set( _gl, skeleton, 'boneTextureHeight' ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial || + material.isMeshLambertMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.isMeshNormalMaterial || + material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } + + // refresh single material specific uniforms + + if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + } else if ( material.isLineDashedMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + refreshUniformsDash( m_uniforms, material ); + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsPhong( m_uniforms, material ); + + } else if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsStandard( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + if ( material.displacementMap ) { + + m_uniforms.displacementMap.value = material.displacementMap; + m_uniforms.displacementScale.value = material.displacementScale; + m_uniforms.displacementBias.value = material.displacementBias; + + } + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsNormal( m_uniforms, material ); + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE; + if ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE; + + WebGLUniforms.upload( + _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + + // common matrices + + p_uniforms.set( _gl, object, 'modelViewMatrix' ); + p_uniforms.set( _gl, object, 'normalMatrix' ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value = material.color; + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + var offset = uvScaleMap.offset; + var repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + var offset = material.map.offset; + var repeat = material.map.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + refreshUniformsStandard( uniforms, material ); + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Lighting + + function setupShadows( lights ) { + + var lightShadowsLength = 0; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + if ( light.castShadow ) { + + _lights.shadows[ lightShadowsLength ++ ] = light; + + } + + } + + _lights.shadows.length = lightShadowsLength; + + } + + function setupLights( lights, camera ) { + + var l, ll, light, + r = 0, g = 0, b = 0, + color, + intensity, + distance, + shadowMap, + + viewMatrix = camera.matrixWorldInverse, + + directionalLength = 0, + pointLength = 0, + spotLength = 0, + rectAreaLength = 0, + hemiLength = 0; + + for ( l = 0, ll = lights.length; l < ll; l ++ ) { + + light = lights[ l ]; + + color = light.color; + intensity = light.intensity; + distance = light.distance; + + shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.directionalShadowMap[ directionalLength ] = shadowMap; + _lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + _lights.directional[ directionalLength ++ ] = uniforms; + + } else if ( light.isSpotLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.spotShadowMap[ spotLength ] = shadowMap; + _lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + _lights.spot[ spotLength ++ ] = uniforms; + + } else if ( light.isRectAreaLight ) { + + var uniforms = lightCache.get( light ); + + // (a) intensity controls irradiance of entire light + uniforms.color + .copy( color ) + .multiplyScalar( intensity / ( light.width * light.height ) ); + + // (b) intensity controls the radiance per light area + // uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + _matrix42.identity(); + _matrix4.copy( light.matrixWorld ); + _matrix4.premultiply( viewMatrix ); + _matrix42.extractRotation( _matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( _matrix42 ); + uniforms.halfHeight.applyMatrix4( _matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + _lights.rectArea[ rectAreaLength ++ ] = uniforms; + + } else if ( light.isPointLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.pointShadowMap[ pointLength ] = shadowMap; + + if ( _lights.pointShadowMatrix[ pointLength ] === undefined ) { + + _lights.pointShadowMatrix[ pointLength ] = new Matrix4(); + + } + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + _vector3.setFromMatrixPosition( light.matrixWorld ).negate(); + _lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 ); + + _lights.point[ pointLength ++ ] = uniforms; + + } else if ( light.isHemisphereLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + _lights.hemi[ hemiLength ++ ] = uniforms; + + } + + } + + _lights.ambient[ 0 ] = r; + _lights.ambient[ 1 ] = g; + _lights.ambient[ 2 ] = b; + + _lights.directional.length = directionalLength; + _lights.spot.length = spotLength; + _lights.rectArea.length = rectAreaLength; + _lights.point.length = pointLength; + _lights.hemi.length = hemiLength; + + // TODO (sam-g-steel) why aren't we using join + _lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length; + + } + + // GL state setting + + this.setFaceCulling = function ( cullFace, frontFaceDirection ) { + + state.setCullFace( cullFace ); + state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW ); + + }; + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function() { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function() { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function() { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + this.getCurrentRenderTarget = function() { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + var framebuffer; + + if ( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + if ( isCube ) { + + framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; + + } else { + + framebuffer = renderTargetProperties.__webglFramebuffer; + + } + + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + _currentViewport.copy( renderTarget.viewport ); + + } else { + + framebuffer = null; + + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + state.viewport( _currentViewport ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + // Map three.js constants to WebGL constants + + function paramThreeToGL( p ) { + + var extension; + + if ( p === RepeatWrapping ) return _gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return _gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return _gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return _gl.BYTE; + if ( p === ShortType ) return _gl.SHORT; + if ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT; + if ( p === IntType ) return _gl.INT; + if ( p === UnsignedIntType ) return _gl.UNSIGNED_INT; + if ( p === FloatType ) return _gl.FLOAT; + + if ( p === HalfFloatType ) { + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return _gl.ALPHA; + if ( p === RGBFormat ) return _gl.RGB; + if ( p === RGBAFormat ) return _gl.RGBA; + if ( p === LuminanceFormat ) return _gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return _gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL; + + if ( p === AddEquation ) return _gl.FUNC_ADD; + if ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return _gl.ZERO; + if ( p === OneFactor ) return _gl.ONE; + if ( p === SrcColorFactor ) return _gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return _gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return _gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === MinEquation || p === MaxEquation ) { + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2 ( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color.getHex(), this.density ); + + }; + + FogExp2.prototype.toJSON = function ( meta ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog ( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color.getHex(), this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( meta ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene () { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.create( Object3D.prototype ); + + Scene.prototype.constructor = Scene; + + Scene.prototype.copy = function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }; + + Scene.prototype.toJSON = function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlare( texture, size, distance, blending, color ) { + + Object3D.call( this ); + + this.lensFlares = []; + + this.positionScreen = new Vector3(); + this.customUpdateCallback = undefined; + + if ( texture !== undefined ) { + + this.add( texture, size, distance, blending, color ); + + } + + } + + LensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LensFlare, + + isLensFlare: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.positionScreen.copy( source.positionScreen ); + this.customUpdateCallback = source.customUpdateCallback; + + for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { + + this.lensFlares.push( source.lensFlares[ i ] ); + + } + + return this; + + }, + + add: function ( texture, size, distance, blending, color, opacity ) { + + if ( size === undefined ) size = - 1; + if ( distance === undefined ) distance = 0; + if ( opacity === undefined ) opacity = 1; + if ( color === undefined ) color = new Color( 0xffffff ); + if ( blending === undefined ) blending = NormalBlending; + + distance = Math.min( distance, Math.max( 0, distance ) ); + + this.lensFlares.push( { + texture: texture, // THREE.Texture + size: size, // size in pixels (-1 = use texture.width) + distance: distance, // distance (0-1) from light source (0=at light source) + x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back + scale: 1, // scale + rotation: 0, // rotation + opacity: opacity, // opacity + color: color, // color + blending: blending // blending + } ); + + }, + + /* + * Update lens flares update positions on all flares based on the screen position + * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. + */ + + updateLensFlares: function () { + + var f, fl = this.lensFlares.length; + var flare; + var vecX = - this.positionScreen.x * 2; + var vecY = - this.positionScreen.y * 2; + + for ( f = 0; f < fl; f ++ ) { + + flare = this.lensFlares[ f ]; + + flare.x = this.positionScreen.x + vecX * flare.distance; + flare.y = this.positionScreen.y + vecY * flare.distance; + + flare.wantedRotation = flare.x * Math.PI * 0.25; + flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition ); + var guessSizeSq = this.scale.x * this.scale.y / 4; + + if ( distanceSq > guessSizeSq ) { + + return; + + } + + intersects.push( { + + distance: Math.sqrt( distanceSq ), + point: this.position, + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses, useVertexTexture ) { + + this.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true; + + this.identityMatrix = new Matrix4(); + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + + // create a bone texture or an array of floats + + if ( this.useVertexTexture ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.nextPowerOfTwo( Math.ceil( size ) ); + size = Math.max( size, 4 ); + + this.boneTextureWidth = size; + this.boneTextureHeight = size; + + this.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel + this.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType ); + + } else { + + this.boneMatrices = new Float32Array( 16 * this.bones.length ); + + } + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton bonInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ b ] ) { + + inverse.getInverse( this.bones[ b ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone; + + // recover the bind-time world matrices + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ b ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + + return function update() { + + // flatten bone matrices to array + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + // compute the offset between the current and the original transform + + var matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] ); + offsetMatrix.toArray( this.boneMatrices, b * 16 ); + + } + + if ( this.useVertexTexture ) { + + this.boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses, this.useVertexTexture ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material, useVertexTexture ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = "attached"; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + // init bones + + // TODO: remove bone creation as there is no reason (other than + // convenience) for THREE.SkinnedMesh to do this. + + var bones = []; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + var bone, gbone; + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + bone = new Bone(); + bones.push( bone ); + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + if ( gbone.parent !== - 1 && gbone.parent !== null && + bones[ gbone.parent ] !== undefined ) { + + bones[ gbone.parent ].add( bones[ b ] ); + + } else { + + this.add( bones[ b ] ); + + } + + } + + } + + this.normalizeSkinWeights(); + + this.updateMatrixWorld( true ); + this.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld ); + + } + + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + bind: function( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + var scale = 1.0 / sw.lengthManhattan(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( var i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + var scale = 1.0 / vec.lengthManhattan(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, true ); + + if ( this.bindMode === "attached" ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === "detached" ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function() { + + return new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new LineSegments( geometry, material ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = (this && this.isLineSegments) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + var intersectPoint = ray.closestPointToPoint( point ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + var scope = this; + + function update() { + + requestAnimationFrame( update ); + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + scope.needsUpdate = true; + + } + + } + + update(); + + } + + VideoTexture.prototype = Object.create( Texture.prototype ); + VideoTexture.prototype.constructor = VideoTexture; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ) + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); // sorting prevents duplicates + + key = edge.toString(); + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + geometry.addGroup( 0, indices.count ); + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge[ 0 ] = indices.getX( i + j ); + edge[ 1 ] = indices.getX( i + ( j + 1 ) % 3 ); + edge.sort( sortFunction ); // sorting prevents duplicates + + key = edge.toString(); + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + // custom array sort function + + function sortFunction( a, b ) { + + return a - b; + + } + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + var i, j; + + // generate vertices and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + var p = func( u, v ); + vertices.push( p.x, p.y, p.z ); + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + */ + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + this.normalizeNormals(); + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + */ + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±1, ±1, ±1) + - 1, - 1, - 1, - 1, - 1, 1, + - 1, 1, - 1, - 1, 1, 1, + 1, - 1, - 1, 1, - 1, 1, + 1, 1, - 1, 1, 1, 1, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * + * Creates a tube which extrudes along a 3d spline. + */ + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + var P = path.getPointAt( i / tubularSegments ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode + */ + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * see: http://www.blackpawn.com/texts/pqtorus/ + */ + + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 100; + tube = tube || 40; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888 + */ + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + triangulate: ( function () { + + /** + * This code is a quick port of code written in C++ which was submitted to + * flipcode.com by John W. Ratcliff // July 22, 2000 + * See original code and more information here: + * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml + * + * ported to actionscript by Zevan Rosser + * www.actionsnippet.com + * + * ported to javascript by Joshua Koo + * http://www.lab4games.net/zz85/blog + * + */ + + function snip( contour, u, v, w, n, verts ) { + + var p; + var ax, ay, bx, by; + var cx, cy, px, py; + + ax = contour[ verts[ u ] ].x; + ay = contour[ verts[ u ] ].y; + + bx = contour[ verts[ v ] ].x; + by = contour[ verts[ v ] ].y; + + cx = contour[ verts[ w ] ].x; + cy = contour[ verts[ w ] ].y; + + if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false; + + var aX, aY, bX, bY, cX, cY; + var apx, apy, bpx, bpy, cpx, cpy; + var cCROSSap, bCROSScp, aCROSSbp; + + aX = cx - bx; aY = cy - by; + bX = ax - cx; bY = ay - cy; + cX = bx - ax; cY = by - ay; + + for ( p = 0; p < n; p ++ ) { + + px = contour[ verts[ p ] ].x; + py = contour[ verts[ p ] ].y; + + if ( ( ( px === ax ) && ( py === ay ) ) || + ( ( px === bx ) && ( py === by ) ) || + ( ( px === cx ) && ( py === cy ) ) ) continue; + + apx = px - ax; apy = py - ay; + bpx = px - bx; bpy = py - by; + cpx = px - cx; cpy = py - cy; + + // see if p is inside triangle abc + + aCROSSbp = aX * bpy - aY * bpx; + cCROSSap = cX * apy - cY * apx; + bCROSScp = bX * cpy - bY * cpx; + + if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; + + } + + return true; + + } + + // takes in an contour array and returns + + return function triangulate( contour, indices ) { + + var n = contour.length; + + if ( n < 3 ) return null; + + var result = [], + verts = [], + vertIndices = []; + + /* we want a counter-clockwise polygon in verts */ + + var u, v, w; + + if ( ShapeUtils.area( contour ) > 0.0 ) { + + for ( v = 0; v < n; v ++ ) verts[ v ] = v; + + } else { + + for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; + + } + + var nv = n; + + /* remove nv - 2 vertices, creating 1 triangle every time */ + + var count = 2 * nv; /* error detection */ + + for ( v = nv - 1; nv > 2; ) { + + /* if we loop, it is probably a non-simple polygon */ + + if ( ( count -- ) <= 0 ) { + + //** Triangulate: ERROR - probable bad polygon! + + //throw ( "Warning, unable to triangulate polygon!" ); + //return null; + // Sometimes warning is fine, especially polygons are triangulated in reverse. + console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); + + if ( indices ) return vertIndices; + return result; + + } + + /* three consecutive vertices in current polygon, */ + + u = v; if ( nv <= u ) u = 0; /* previous */ + v = u + 1; if ( nv <= v ) v = 0; /* new v */ + w = v + 1; if ( nv <= w ) w = 0; /* next */ + + if ( snip( contour, u, v, w, nv, verts ) ) { + + var a, b, c, s, t; + + /* true names of the vertices */ + + a = verts[ u ]; + b = verts[ v ]; + c = verts[ w ]; + + /* output Triangle */ + + result.push( [ contour[ a ], + contour[ b ], + contour[ c ] ] ); + + + vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); + + /* remove v from the remaining polygon */ + + for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { + + verts[ s ] = verts[ t ]; + + } + + nv --; + + /* reset error detection counter */ + + count = 2 * nv; + + } + + } + + if ( indices ) return vertIndices; + return result; + + } + + } )(), + + triangulateShape: function ( contour, holes ) { + + function removeDupEndPts(points) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + removeDupEndPts( contour ); + holes.forEach( removeDupEndPts ); + + function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { + + // inOtherPt needs to be collinear to the inSegment + if ( inSegPt1.x !== inSegPt2.x ) { + + if ( inSegPt1.x < inSegPt2.x ) { + + return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); + + } else { + + return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); + + } + + } else { + + if ( inSegPt1.y < inSegPt2.y ) { + + return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); + + } else { + + return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); + + } + + } + + } + + function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { + + var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; + var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; + + var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; + var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; + + var limit = seg1dy * seg2dx - seg1dx * seg2dy; + var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; + + if ( Math.abs( limit ) > Number.EPSILON ) { + + // not parallel + + var perpSeg2; + if ( limit > 0 ) { + + if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; + + } else { + + if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; + + } + + // i.e. to reduce rounding errors + // intersection at endpoint of segment#1? + if ( perpSeg2 === 0 ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt1 ]; + + } + if ( perpSeg2 === limit ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt2 ]; + + } + // intersection at endpoint of segment#2? + if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; + if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; + + // return real intersection point + var factorSeg1 = perpSeg2 / limit; + return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, + y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; + + } else { + + // parallel or collinear + if ( ( perpSeg1 !== 0 ) || + ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; + + // they are collinear or degenerate + var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? + var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? + // both segments are points + if ( seg1Pt && seg2Pt ) { + + if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || + ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points + return [ inSeg1Pt1 ]; // they are the same point + + } + // segment#1 is a single point + if ( seg1Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 + return [ inSeg1Pt1 ]; + + } + // segment#2 is a single point + if ( seg2Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 + return [ inSeg2Pt1 ]; + + } + + // they are collinear segments, which might overlap + var seg1min, seg1max, seg1minVal, seg1maxVal; + var seg2min, seg2max, seg2minVal, seg2maxVal; + if ( seg1dx !== 0 ) { + + // the segments are NOT on a vertical line + if ( inSeg1Pt1.x < inSeg1Pt2.x ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; + + } + if ( inSeg2Pt1.x < inSeg2Pt2.x ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; + + } + + } else { + + // the segments are on a vertical line + if ( inSeg1Pt1.y < inSeg1Pt2.y ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; + + } + if ( inSeg2Pt1.y < inSeg2Pt2.y ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; + + } + + } + if ( seg1minVal <= seg2minVal ) { + + if ( seg1maxVal < seg2minVal ) return []; + if ( seg1maxVal === seg2minVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg2min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; + return [ seg2min, seg2max ]; + + } else { + + if ( seg1minVal > seg2maxVal ) return []; + if ( seg1minVal === seg2maxVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg1min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; + return [ seg1min, seg2max ]; + + } + + } + + } + + function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { + + // The order of legs is important + + // translation of all points, so that Vertex is at (0,0) + var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; + var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; + var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; + + // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. + var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; + var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; + + if ( Math.abs( from2toAngle ) > Number.EPSILON ) { + + // angle != 180 deg. + + var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; + // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); + + if ( from2toAngle > 0 ) { + + // main angle < 180 deg. + return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); + + } else { + + // main angle > 180 deg. + return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); + + } + + } else { + + // angle == 180 deg. + // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); + return ( from2otherAngle > 0 ); + + } + + } + + + function removeHoles( contour, holes ) { + + var shape = contour.concat(); // work on this shape + var hole; + + function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { + + // Check if hole point lies within angle around shape point + var lastShapeIdx = shape.length - 1; + + var prevShapeIdx = inShapeIdx - 1; + if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; + + var nextShapeIdx = inShapeIdx + 1; + if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; + + var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); + return false; + + } + + // Check if shape point lies within angle around hole point + var lastHoleIdx = hole.length - 1; + + var prevHoleIdx = inHoleIdx - 1; + if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; + + var nextHoleIdx = inHoleIdx + 1; + if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; + + insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); + return false; + + } + + return true; + + } + + function intersectsShapeEdge( inShapePt, inHolePt ) { + + // checks for intersections with shape edges + var sIdx, nextIdx, intersection; + for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { + + nextIdx = sIdx + 1; nextIdx %= shape.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + return false; + + } + + var indepHoles = []; + + function intersectsHoleEdge( inShapePt, inHolePt ) { + + // checks for intersections with hole edges + var ihIdx, chkHole, + hIdx, nextIdx, intersection; + for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { + + chkHole = holes[ indepHoles[ ihIdx ]]; + for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { + + nextIdx = hIdx + 1; nextIdx %= chkHole.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + } + return false; + + } + + var holeIndex, shapeIndex, + shapePt, holePt, + holeIdx, cutKey, failedCuts = [], + tmpShape1, tmpShape2, + tmpHole1, tmpHole2; + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + indepHoles.push( h ); + + } + + var minShapeIndex = 0; + var counter = indepHoles.length * 2; + while ( indepHoles.length > 0 ) { + + counter --; + if ( counter < 0 ) { + + console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); + break; + + } + + // search for shape-vertex and hole-vertex, + // which can be connected without intersections + for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { + + shapePt = shape[ shapeIndex ]; + holeIndex = - 1; + + // search for hole which can be reached without intersections + for ( var h = 0; h < indepHoles.length; h ++ ) { + + holeIdx = indepHoles[ h ]; + + // prevent multiple checks + cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; + if ( failedCuts[ cutKey ] !== undefined ) continue; + + hole = holes[ holeIdx ]; + for ( var h2 = 0; h2 < hole.length; h2 ++ ) { + + holePt = hole[ h2 ]; + if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; + if ( intersectsShapeEdge( shapePt, holePt ) ) continue; + if ( intersectsHoleEdge( shapePt, holePt ) ) continue; + + holeIndex = h2; + indepHoles.splice( h, 1 ); + + tmpShape1 = shape.slice( 0, shapeIndex + 1 ); + tmpShape2 = shape.slice( shapeIndex ); + tmpHole1 = hole.slice( holeIndex ); + tmpHole2 = hole.slice( 0, holeIndex + 1 ); + + shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); + + minShapeIndex = shapeIndex; + + // Debug only, to show the selected cuts + // glob_CutLines.push( [ shapePt, holePt ] ); + + break; + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + failedCuts[ cutKey ] = true; // remember failure + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + } + + } + + return shape; /* shape with no holes */ + + } + + + var i, il, f, face, + key, index, + allPointsMap = {}; + + // 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. + + var allpoints = contour.concat(); + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + Array.prototype.push.apply( allpoints, holes[ h ] ); + + } + + //console.log( "allpoints",allpoints, allpoints.length ); + + // prepare all points map + + for ( i = 0, il = allpoints.length; i < il; i ++ ) { + + key = allpoints[ i ].x + ":" + allpoints[ i ].y; + + if ( allPointsMap[ key ] !== undefined ) { + + console.warn( "THREE.ShapeUtils: Duplicate point", key, i ); + + } + + allPointsMap[ key ] = i; + + } + + // remove holes by cutting paths to holes and adding them to the shape + var shapeWithoutHoles = removeHoles( contour, holes ); + + var triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape + //console.log( "triangles",triangles, triangles.length ); + + // check all face vertices against all points map + + for ( i = 0, il = triangles.length; i < il; i ++ ) { + + face = triangles[ i ]; + + for ( f = 0; f < 3; f ++ ) { + + key = face[ f ].x + ":" + face[ f ].y; + + index = allPointsMap[ key ]; + + if ( index !== undefined ) { + + face[ f ] = index; + + } + + } + + } + + return triangles.concat(); + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + } + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * frames: // containing arrays of tangents, normals, binormals + * + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + + function ExtrudeGeometry( shapes, options ) { + + if ( typeof( shapes ) === "undefined" ) { + + shapes = []; + return; + + } + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) { + + var sl = shapes.length; + + for ( var s = 0; s < sl; s ++ ) { + + var shape = shapes[ s ]; + this.addShape( shape, options ); + + } + + }; + + ExtrudeGeometry.prototype.addShape = function ( shape, options ) { + + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var steps = options.steps !== undefined ? options.steps : 1; + + var extrudePath = options.extrudePath; + var extrudePts, extrudeByPath = false; + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator; + + var splineTube, binormal, normal, position2; + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + var scope = this; + + var shapesOffset = this.vertices.length; + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos ( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d, contour, s, sl, j, k ); + + } + + } + + } + + + function v( x, y, z ) { + + scope.vertices.push( new Vector3( x, y, z ) ); + + } + + function f3( a, b, c ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + + scope.faces.push( new Face3( a, b, c, null, null, 0 ) ); + + var uvs = uvgen.generateTopUV( scope, a, b, c ); + + scope.faceVertexUvs[ 0 ].push( uvs ); + + } + + function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + d += shapesOffset; + + scope.faces.push( new Face3( a, b, d, null, null, 1 ) ); + scope.faces.push( new Face3( b, c, d, null, null, 1 ) ); + + var uvs = uvgen.generateSideWallUV( scope, a, b, c, d ); + + scope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] ); + scope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] ); + + } + + }; + + ExtrudeGeometry.WorldUVGenerator = { + + generateTopUV: function ( geometry, indexA, indexB, indexC ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + + return [ + new Vector2( a.x, a.y ), + new Vector2( b.x, b.y ), + new Vector2( c.x, c.y ) + ]; + + }, + + generateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + var d = vertices[ indexD ]; + + if ( Math.abs( a.y - b.y ) < 0.01 ) { + + return [ + new Vector2( a.x, 1 - a.z ), + new Vector2( b.x, 1 - b.z ), + new Vector2( c.x, 1 - c.z ), + new Vector2( d.x, 1 - d.z ) + ]; + + } else { + + return [ + new Vector2( a.y, 1 - a.z ), + new Vector2( b.y, 1 - b.z ), + new Vector2( c.y, 1 - c.z ), + new Vector2( d.y, 1 - d.z ) + ]; + + } + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + + function TextGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ( font && font.isFont ) === false ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeGeometry.call( this, shapes, parameters ); + + this.type = 'TextGeometry'; + + } + + TextGeometry.prototype = Object.create( ExtrudeGeometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author Kaleb Murphy + */ + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 20; + outerRadius = outerRadius || 50; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + */ + + // points - to create a closed torus, one must use a set of points + // like so: [ a, b, c, d, a ], see first is the same as last. + // segments - the number of circumference segments to create + // phiStart - the starting radian + // phiLength - the radian (0 to 2PI) range of the lathed section + // 2PI is a closed lathe, less than 2PI is a portion. + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + */ + + function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + key = edge.toString(); + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + edges[ key ].face2 = i; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var e = edges[ key ]; + + // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. + + if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + // custom array sort function + + function sortFunction( a, b ) { + + return a - b; + + } + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 20; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; + height = height !== undefined ? height : 100; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexOffset = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + /** + * @author: abelnation / http://github.com/abelnation + */ + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author hughes + */ + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ShadowMaterial() { + + ShaderMaterial.call( this, { + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + { + opacity: { value: 1.0 } + } + ] ), + vertexShader: ShaderChunk[ 'shadow_vert' ], + fragmentShader: ShaderChunk[ 'shadow_frag' ] + } ); + + this.lights = true; + this.transparent = true; + + Object.defineProperties( this, { + opacity: { + enumerable: true, + get: function () { + return this.uniforms.opacity.value; + }, + set: function ( value ) { + this.uniforms.opacity.value = value; + } + } + } ); + + } + + ShadowMaterial.prototype = Object.create( ShaderMaterial.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MultiMaterial( materials ) { + + this.uuid = _Math.generateUUID(); + + this.type = 'MultiMaterial'; + + this.materials = Array.isArray( materials ) ? materials : []; + + this.visible = true; + + } + + MultiMaterial.prototype = { + + constructor: MultiMaterial, + + isMultiMaterial: true, + + toJSON: function ( meta ) { + + var output = { + metadata: { + version: 4.2, + type: 'material', + generator: 'MaterialExporter' + }, + uuid: this.uuid, + type: this.type, + materials: [] + }; + + var materials = this.materials; + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + var material = materials[ i ].toJSON( meta ); + delete material.metadata; + + output.materials.push( material ); + + } + + output.visible = this.visible; + + return output; + + }, + + clone: function () { + + var material = new this.constructor(); + + for ( var i = 0; i < this.materials.length; i ++ ) { + + material.materials.push( this.materials[ i ].clone() ); + + } + + material.visible = this.visible; + + return material; + + } + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( ) + * } + */ + + function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this, parameters ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + + function LineDashedMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineDashedMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( Material.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MultiMaterial: MultiMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false, itemsLoaded = 0, itemsTotal = 0; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = window.decodeURIComponent( data ); + + if ( isBase64 ) data = window.atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + response = new ArrayBuffer( data.length ); + + var view = new Uint8Array( response ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ response ], { type: mimeType } ); + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick + window.setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick + window.setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + var request = new XMLHttpRequest(); + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = event.target.response; + + Cache.add( url, response ); + + if ( this.status === 200 ) { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else if ( this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + } + + }, false ); + + if ( onProgress !== undefined ) { + + request.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + image.addEventListener( 'load', function () { + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + }, false ); + + /* + image.addEventListener( 'progress', function ( event ) { + + if ( onProgress ) onProgress( event ); + + }, false ); + */ + + image.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + }, false ); + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + loader.load( url, function ( image ) { + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.image = image; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || 500; + + var camera = this.camera; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * Math.PI; + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / Math.PI; + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / ( 4 * Math.PI ); + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + return new array.constructor( array.subarray( from, to ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Interpolant.prototype = { + + constructor: Interpolant, + + evaluate: function( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ;) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ;) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function() { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function( i1, t0, t, t1 ) { + + throw new Error( "call to abstract method" ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + // empty + + } + + }; + + Object.assign( Interpolant.prototype, { + + beforeStart_: //( 0, t, t0 ), returns this.resultBuffer + Interpolant.prototype.copySampleValue_, + + afterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer + Interpolant.prototype.copySampleValue_ + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + + } + + CubicInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1; + var s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + var KeyframeTrackPrototype; + + KeyframeTrackPrototype = { + + TimeBufferType: Float32Array, + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( message ); + return; + + } + + this.createInterpolant = factoryMethod; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) ++ from; + while ( to !== - 1 && times[ to ] > endTime ) -- to; + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils. + arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( "invalid value size in track", this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( "track is empty", this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( "time is not a valid number", this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( "out of order keys", this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( "value is not a valid number", this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else keep = true; + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + }; + + function KeyframeTrackConstructor( name, times, values, interpolation ) { + + if( name === undefined ) throw new Error( "track name is undefined" ); + + if( times === undefined || times.length === 0 ) { + + throw new Error( "no keyframes in track named " + name ); + + } + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + this.validate(); + this.optimize(); + + } + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, + values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function( result ) { + + return new QuaternionLinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrackConstructor.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.apply( this, arguments ); + + } + + KeyframeTrack.prototype = KeyframeTrackPrototype; + KeyframeTrackPrototype.constructor = KeyframeTrack; + + // Static methods: + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function( json ) { + + if( json.type === undefined ) { + + throw new Error( "track type undefined, can not parse" ); + + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we asssume a constructor compatible with the base + return new trackType( + json.name, json.times, json.values, json.interpolation ); + + } + + }, + + toJSON: function( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + }, + + _getTrackTypeForValueTypeName: function( typeName ) { + + switch( typeName.toLowerCase() ) { + + case "scalar": + case "double": + case "float": + case "number": + case "integer": + + return NumberKeyframeTrack; + + case "vector": + case "vector2": + case "vector3": + case "vector4": + + return VectorKeyframeTrack; + + case "color": + + return ColorKeyframeTrack; + + case "quaternion": + + return QuaternionKeyframeTrack; + + case "bool": + case "boolean": + + return BooleanKeyframeTrack; + + case "string": + + return StringKeyframeTrack; + + } + + throw new Error( "Unsupported typeName: " + typeName ); + + } + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : -1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + this.optimize(); + + } + + AnimationClip.prototype = { + + constructor: AnimationClip, + + resetDuration: function() { + + var tracks = this.tracks, + duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + }, + + trim: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + }; + + // Static methods: + + Object.assign( AnimationClip, { + + parse: function( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + + toJSON: function( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + + CreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + } + + return new AnimationClip( name, -1, tracks ); + + }, + + findByName: function( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function( animation, bones ) { + + if ( ! animation ) { + + console.error( " no animation in JSONLoader data" ); + return null; + + } + + var addNonemptyTrack = function( + trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( + animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || -1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets in a way exactly compatible + // with AnimationHandler.init( animation ) + if ( animationKeys[0].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[k].morphTargets ) { + + for ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[k].morphTargets[m] ] = -1; + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[k].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[k]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.shading !== undefined ) material.shading = json.shading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + // MultiMaterial + + if ( json.materials !== undefined ) { + + for ( var i = 0, l = json.materials.length; i < l; i ++ ) { + + material.materials.push( this.parse( json.materials[ i ] ) ); + + } + + } + + return material; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + var TYPED_ARRAYS = { + 'Int8Array': Int8Array, + 'Uint8Array': Uint8Array, + 'Uint8ClampedArray': Uint8ClampedArray, + 'Int16Array': Int16Array, + 'Uint16Array': Uint16Array, + 'Int32Array': Int32Array, + 'Uint32Array': Uint32Array, + 'Float32Array': Float32Array, + 'Float64Array': Float64Array + }; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() { + + this.onLoadStart = function () {}; + this.onLoadProgress = function () {}; + this.onLoadComplete = function () {}; + + } + + Loader.prototype = { + + constructor: Loader, + + crossOrigin: undefined, + + extractUrlBase: function ( url ) { + + var parts = url.split( '/' ); + + if ( parts.length === 1 ) return './'; + + parts.pop(); + + return parts.join( '/' ) + '/'; + + }, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color, textureLoader, materialLoader; + + return function createMaterial( m, texturePath, crossOrigin ) { + + if ( color === undefined ) color = new Color(); + if ( textureLoader === undefined ) textureLoader = new TextureLoader(); + if ( materialLoader === undefined ) materialLoader = new MaterialLoader(); + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = [ value, value ]; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + }; + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + load: function( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader.prototype.extractUrlBase( url ); + + var loader = new FileLoader( this.manager ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + if ( type.toLowerCase() === 'scene' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: function ( json, texturePath ) { + + var geometry = new Geometry(), + scale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0; + + parseModel( scale ); + + parseSkin(); + parseMorphing( scale ); + parseAnimations(); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + function parseModel( scale ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + nUvLayers = 0; + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin() { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( scale ) { + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations() { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var geometries = this.parseGeometries( json.geometries ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseGeometries: function ( json ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'IcosahedronGeometry': + case 'OctahedronGeometry': + case 'TetrahedronGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data.data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var material = loader.parse( json[ i ] ); + materials[ material.uuid ] = material; + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + var TextureMapping = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + var TextureWrapping = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + var TextureFilter = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + + function parseConstant( value, type ) { + + if ( typeof( value ) === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping ); + + } + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function () { + + var matrix = new Matrix4(); + + return function parseObject( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.' ); + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + matrix.fromArray( data.matrix ); + matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + for ( var child in data.children ) { + + object.add( this.parseObject( data.children[ child ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + }; + + }() + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function QuadraticBezierP2( t, p ) { + + return t * t * p; + + } + + function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + + } + + function CubicBezierP3( t, p ) { + + return t * t * t * p; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of Curve methods + * .getPoint(t), getTangent(t) + * .getPointAt(u), getTangentAt(u) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following classes subclasses THREE.Curve: + * + * -- 2d classes -- + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.CubicBezierCurve + * THREE.SplineCurve + * THREE.ArcCurve + * THREE.EllipseCurve + * + * -- 3d classes -- + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * THREE.CubicBezierCurve3 + * THREE.CatmullRomCurve3 + * + * A series of curves can be represented as a THREE.CurvePath + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() {} + + Curve.prototype = { + + constructor: Curve, + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( t ) { + + console.warn( "THREE.Curve: Warning, getPoint() not implemented!" ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( isNaN( divisions ) ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( isNaN( divisions ) ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( isNaN( divisions ) ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200; + + if ( this.cacheArcLengths + && ( this.cacheArcLengths.length === divisions + 1 ) + && ! this.needsUpdate ) { + + //console.log( "cached", this.cacheArcLengths ); + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint ( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum:sum }; Sum is in the last element. + + }, + + updateArcLengths: function() { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + //var time = Date.now(); + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = 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 + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + //console.log('b' , i, low, high, Date.now()- time); + + if ( arcLengths[ i ] === targetArcLength ) { + + var t = i / ( il - 1 ); + return t; + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + }; + + function LineCurve( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var point = this.v2.clone().sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u ) { + + return this.getPoint( u ); + + }; + + LineCurve.prototype.getTangent = function ( t ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + this.curves = []; + + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + /************************************************************** + * Create Geometries Helpers + **************************************************************/ + + /// Generate geometry from path points (for Line or Points objects) + + createPointsGeometry: function ( divisions ) { + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + // Generate geometry from equidistant sampling along the path + + createSpacedPointsGeometry: function ( divisions ) { + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t ) { + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return new Vector2( x, y ); + + }; + + function SplineCurve( points /* array of Vector2 */ ) { + + this.points = ( points === undefined ) ? [] : points; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + return new Vector2( + CatmullRom( weight, point0.x, point1.x, point2.x, point3.x ), + CatmullRom( weight, point0.y, point1.y, point2.y, point3.y ) + ); + + }; + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + return new Vector2( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + }; + + function QuadraticBezierCurve( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + return new Vector2( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + }; + + var PathPrototype = Object.assign( Object.create( CurvePath.prototype ), { + + fromPoints: function ( vectors ) { + + this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); + + for ( var i = 1, l = vectors.length; i < l; i ++ ) { + + this.lineTo( vectors[ i ].x, vectors[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path( points ) { + + CurvePath.call( this ); + this.currentPoint = new Vector2(); + + if ( points ) { + + this.fromPoints( points ); + + } + + } + + Path.prototype = PathPrototype; + PathPrototype.constructor = Path; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape() { + + Path.apply( this, arguments ); + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( PathPrototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // Get points of shape and holes (keypoints based on segments parameter) + + extractAllPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + extractPoints: function ( divisions ) { + + return this.extractAllPoints( divisions ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + + this.subPaths = []; + this.currentPath = null; + + } + + ShapePath.prototype = { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font( data ) { + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size, divisions ) { + + function createPaths( text ) { + + var chars = String( text ).split( '' ); + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var offsetX = 0, offsetY = 0; + + var paths = []; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, scale, offsetX, offsetY ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( c, scale, offsetX, offsetY ) { + + var glyph = data.glyphs[ c ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var pts = []; + var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + QuadraticBezier( t, cpx0, cpx1, cpx ); + QuadraticBezier( t, cpy0, cpy1, cpy ); + + } + + } + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + cpx2 = outline[ i ++ ] * scale + offsetX; + cpy2 = outline[ i ++ ] * scale + offsetY; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + CubicBezier( t, cpx0, cpx1, cpx2, cpx ); + CubicBezier( t, cpy0, cpy1, cpy2, cpy ); + + } + + } + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + // + + if ( size === undefined ) size = 100; + if ( divisions === undefined ) divisions = 4; + + var data = this.data; + + var paths = createPaths( text ); + var shapes = []; + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + } + + } ); + + var context; + + var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + var context = AudioContext.getContext(); + + context.decodeAudioData( buffer, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + } + + } ); + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight ( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + // TODO (abelnation): distance/decay + + // TODO (abelnation): update method for RectAreaLight to update transform to lookat target + + // TODO (abelnation): shadows + // this.shadow = new THREE.RectAreaLightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + // TODO (abelnation): RectAreaLight update when light shape is changed + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + // this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + var eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + + this.updateCubeMap = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.value = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + source.start( 0, this.startTime ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = this.context.currentTime; + this.isPlaying = false; + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + + setVolume: function ( value ) { + + this.gain.gain.value = value; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + PropertyMixer.prototype = { + + constructor: PropertyMixer, + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function() { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function() { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function( buffer, dstOffset, srcOffset, t, stride ) { + + Quaternion.slerpFlat( buffer, dstOffset, + buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + }; + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || + PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( + rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + PropertyBinding.prototype = { + + constructor: PropertyBinding, + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function() { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( + this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( " trying to update node for track: " + this.path + " but it wasn't found." ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( ' can not bind to material as node does not have a material', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( ' can not bind to material.materials as node.material does not have a materials array', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( ' can not bind to bones as node does not have a skeleton', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( ' can not bind to objectName of node, undefined', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( " trying to update property for track: " + nodeName + + '.' + propertyName + " but it wasn't found.", targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + this.targetObject = targetObject; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + this.targetObject = targetObject; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); + return; + + } + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( nodeProperty.length !== undefined ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function() { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + }; + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function() {}, + _setValue_unavailable: function() {}, + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ] + + } ); + + PropertyBinding.Composite = + function( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || + PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + }; + + PropertyBinding.Composite.prototype = { + + constructor: PropertyBinding.Composite, + + getValue: function( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function() { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function() { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + }; + + PropertyBinding.create = function( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }; + + PropertyBinding.parseTrackName = function( trackName ) { + + // matches strings in the form of: + // nodeName.property + // nodeName.property[accessor] + // nodeName.material.property[accessor] + // uuid.property[accessor] + // uuid.objectName[objectIndex].propertyName[propertyIndex] + // parentName/nodeName.property + // parentName/parentName/nodeName.property[index] + // .bone[Armature.DEF_cog].position + // scene:helium_balloon_model:helium_balloon_model.position + // created and tested via https://regex101.com/#javascript + + var re = /^((?:[\w-]+[\/:])*)([\w-]+)?(?:\.([\w-]+)(?:\[(.+)\])?)?\.([\w-]+)(?:\[(.+)\])?$/; + var matches = re.exec( trackName ); + + if ( ! matches ) { + + throw new Error( "cannot parse trackName at all: " + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], // allowed to be null, specified root node. + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], + propertyIndex: matches[ 6 ] // allowed to be null, specifies that the whole property is set. + }; + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( "can not parse propertyName from trackName: " + trackName ); + + } + + return results; + + }; + + PropertyBinding.findNode = function( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var searchSkeleton = function( skeleton ) { + + for( var i = 0; i < skeleton.bones.length; i ++ ) { + + var bone = skeleton.bones[ i ]; + + if ( bone.name === nodeName ) { + + return bone; + + } + } + + return null; + + }; + + var bone = searchSkeleton( root.skeleton ); + + if ( bone ) { + + return bone; + + } + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function( children ) { + + for( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + }; + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup( var_args ) { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { return scope._objects.length; }, + get inUse() { return this.total - scope.nCachedObjects_; } + }, + + get bindingsPerObject() { return scope._bindings.length; } + + }; + + } + + AnimationObjectGroup.prototype = { + + constructor: AnimationObjectGroup, + + isAnimationObjectGroup: true, + + add: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ], + knownObject = undefined; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( + new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject) { + + console.error( "Different objects with the same UUID " + + "detected. Clean the caches or recreate your " + + "infrastructure when reloading scenes..." ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function( var_args ) { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function( path, parsedPath ) { + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, + n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + + bindingsForPath[ i ] = + new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function( path ) { + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + }; + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = -1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // false -> zero effective time scale + this.enabled = true; // true -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + AnimationAction.prototype = { + + constructor: AnimationAction, + + // State & Scheduling + + play: function() { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = -1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function() { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function() { + + return this._effectiveWeight; + + }, + + fadeIn: function( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function() { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the weight stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 :timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function() { + + return this._effectiveTimeScale; + + }, + + setDuration: function( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function() { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function() { + + return this._mixer; + + }, + + getClip: function() { + + return this._clip; + + }, + + getRoot: function() { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function( time, deltaTime, timeDirection, accuIndex ) { + // called by the mixer + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function( deltaTime ) { + + var time = this.time + deltaTime; + + if ( deltaTime === 0 ) return time; + + var duration = this._clip.duration, + + loop = this.loop, + loopCount = this._loopCount; + + if ( loop === LoopOnce ) { + + if ( loopCount === -1 ) { + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? -1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + var pingPong = ( loop === LoopPingPong ); + + if ( loopCount === -1 ) { + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( + true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( + this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending < 0 ) { + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : -1 + } ); + + } else { + // keep running + + if ( pending === 0 ) { + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + }; + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + AnimationMixer.prototype = { + + constructor: AnimationMixer, + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + if ( action.enabled ) { + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + }; + + // Implementation details: + + Object.assign( AnimationMixer.prototype, { + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { return scope._actions.length; }, + get inUse() { return scope._nActiveActions; } + }, + bindings: { + get total() { return scope._bindings.length; }, + get inUse() { return scope._nActiveBindings; } + }, + controlInterpolants: { + get total() { return scope._controlInterpolants.length; }, + get inUse() { return scope._nActiveControlInterpolants; } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( actions._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ) + + } ); + + Object.assign( AnimationMixer.prototype, EventDispatcher.prototype ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + InstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry; + + InstancedBufferGeometry.prototype.isInstancedBufferGeometry = true; + + InstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + }; + + InstancedBufferGeometry.prototype.copy = function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + return this; + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.uuid = _Math.generateUUID(); + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + + InterleavedBufferAttribute.prototype = { + + constructor: InterleavedBufferAttribute, + + isInterleavedBufferAttribute: true, + + get count() { + + return this.data.count; + + }, + + get array() { + + return this.data.array; + + }, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.onUploadCallback = function () {}; + + this.version = 0; + + } + + InterleavedBuffer.prototype = { + + constructor: InterleavedBuffer, + + isInterleavedBuffer: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype ); + InstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer; + + InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true; + + InstancedInterleavedBuffer.prototype.copy = function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) { + + BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + InstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute; + + InstancedBufferAttribute.prototype.isInstancedBufferAttribute = true; + + InstancedBufferAttribute.prototype.copy = function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + // + + Raycaster.prototype = { + + constructor: Raycaster, + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( (camera && camera.isPerspectiveCamera) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( (camera && camera.isOrthographicCamera) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive ) { + + var intersects = []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive ) { + + var intersects = []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Clock.prototype = { + + constructor: Clock, + + start: function () { + + this.startTime = ( performance || Date ).now(); + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + + } + + if ( this.running ) { + + var newTime = ( performance || Date ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + }; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The poles (phi) are at the positive and negative y axis. + * The equator starts at positive z. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole + this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere + + return this; + + } + + Spherical.prototype = { + + constructor: Spherical, + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function() { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = vec3.length(); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis + this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle + + } + + return this; + + } + + }; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + Cylindrical.prototype = { + + constructor: Cylindrical, + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z ); + this.theta = Math.atan2( vec3.x, vec3.z ); + this.y = vec3.y; + + return this; + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function MorphBlendMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.animationsMap = {}; + this.animationsList = []; + + // prepare default animation + // (all frames played together in 1 second) + + var numFrames = this.geometry.morphTargets.length; + + var name = "__default"; + + var startFrame = 0; + var endFrame = numFrames - 1; + + var fps = numFrames / 1; + + this.createAnimation( name, startFrame, endFrame, fps ); + this.setAnimationWeight( name, 1 ); + + } + + MorphBlendMesh.prototype = Object.create( Mesh.prototype ); + MorphBlendMesh.prototype.constructor = MorphBlendMesh; + + MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { + + var animation = { + + start: start, + end: end, + + length: end - start + 1, + + fps: fps, + duration: ( end - start ) / fps, + + lastFrame: 0, + currentFrame: 0, + + active: false, + + time: 0, + direction: 1, + weight: 1, + + directionBackwards: false, + mirroredLoop: false + + }; + + this.animationsMap[ name ] = animation; + this.animationsList.push( animation ); + + }; + + MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { + + var pattern = /([a-z]+)_?(\d+)/i; + + var firstAnimation, frameRanges = {}; + + var geometry = this.geometry; + + for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { + + var morph = geometry.morphTargets[ i ]; + var chunks = morph.name.match( pattern ); + + if ( chunks && chunks.length > 1 ) { + + var name = chunks[ 1 ]; + + if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; + + var range = frameRanges[ name ]; + + if ( i < range.start ) range.start = i; + if ( i > range.end ) range.end = i; + + if ( ! firstAnimation ) firstAnimation = name; + + } + + } + + for ( var name in frameRanges ) { + + var range = frameRanges[ name ]; + this.createAnimation( name, range.start, range.end, fps ); + + } + + this.firstAnimation = firstAnimation; + + }; + + MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = 1; + animation.directionBackwards = false; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = - 1; + animation.directionBackwards = true; + + } + + }; + + MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.fps = fps; + animation.duration = ( animation.end - animation.start ) / animation.fps; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.duration = duration; + animation.fps = ( animation.end - animation.start ) / animation.duration; + + } + + }; + + MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.weight = weight; + + } + + }; + + MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = time; + + } + + }; + + MorphBlendMesh.prototype.getAnimationTime = function ( name ) { + + var time = 0; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + time = animation.time; + + } + + return time; + + }; + + MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { + + var duration = - 1; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + duration = animation.duration; + + } + + return duration; + + }; + + MorphBlendMesh.prototype.playAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = 0; + animation.active = true; + + } else { + + console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); + + } + + }; + + MorphBlendMesh.prototype.stopAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.active = false; + + } + + }; + + MorphBlendMesh.prototype.update = function ( delta ) { + + for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { + + var animation = this.animationsList[ i ]; + + if ( ! animation.active ) continue; + + var frameTime = animation.duration / animation.length; + + animation.time += animation.direction * delta; + + if ( animation.mirroredLoop ) { + + if ( animation.time > animation.duration || animation.time < 0 ) { + + animation.direction *= - 1; + + if ( animation.time > animation.duration ) { + + animation.time = animation.duration; + animation.directionBackwards = true; + + } + + if ( animation.time < 0 ) { + + animation.time = 0; + animation.directionBackwards = false; + + } + + } + + } else { + + animation.time = animation.time % animation.duration; + + if ( animation.time < 0 ) animation.time += animation.duration; + + } + + var keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); + var weight = animation.weight; + + if ( keyframe !== animation.currentFrame ) { + + this.morphTargetInfluences[ animation.lastFrame ] = 0; + this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; + + this.morphTargetInfluences[ keyframe ] = 0; + + animation.lastFrame = animation.currentFrame; + animation.currentFrame = keyframe; + + } + + var mix = ( animation.time % frameTime ) / frameTime; + + if ( animation.directionBackwards ) mix = 1 - mix; + + if ( animation.currentFrame !== animation.lastFrame ) { + + this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; + this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; + + } else { + + this.morphTargetInfluences[ animation.currentFrame ] = weight; + + } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( renderCallback ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + return this; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + this.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function SkeletonHelper( object ) { + + this.bones = this.getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + } + + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.getBoneList = function( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + }; + + SkeletonHelper.prototype.update = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function update() { + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize ) { + + this.light = light; + this.light.updateMatrixWorld(); + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + this.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + */ + + function RectAreaLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + var materialFront = new MeshBasicMaterial( { + color: light.color, + fog: false + } ); + + var materialBack = new MeshBasicMaterial( { + color: light.color, + fog: false, + wireframe: true + } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 6 * 3 ), 3 ) ); + + // shows the "front" of the light, e.g. where light comes from + + this.add( new Mesh( geometry, materialFront ) ); + + // shows the "back" of the light, which does not emit light + + this.add( new Mesh( geometry, materialBack ) ); + + this.update(); + + } + + RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + + RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + this.children[ 1 ].geometry.dispose(); + this.children[ 1 ].material.dispose(); + + }; + + RectAreaLightHelper.prototype.update = function () { + + var vector1 = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + var mesh1 = this.children[ 0 ]; + var mesh2 = this.children[ 1 ]; + + if ( this.light.target ) { + + vector1.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + var lookVec = vector2.clone().sub( vector1 ); + mesh1.lookAt( lookVec ); + mesh2.lookAt( lookVec ); + + } + + // update materials + + mesh1.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + mesh2.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + // because the buffer attribute is shared over both geometries, we only have to update once + + var position = mesh1.geometry.getAttribute( 'position' ); + var array = position.array; + + // first face + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + + // second face + + array[ 9 ] = - hx; array[ 10 ] = hy; array[ 11 ] = 0; + array[ 12 ] = - hx; array[ 13 ] = - hy; array[ 14 ] = 0; + array[ 15 ] = hx; array[ 16 ] = - hy; array[ 17 ] = 0; + + position.needsUpdate = true; + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + var material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } ); + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, material ) ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ).multiplyScalar( this.light.intensity ); + color2.copy( this.light.groundColor ).multiplyScalar( this.light.intensity ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + colors.needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + PolarGridHelper.prototype = Object.create( LineSegments.prototype ); + PolarGridHelper.prototype.constructor = PolarGridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + return this; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.add( new Line( geometry, material ) ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.add( new Line( geometry, material )); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.geometry.dispose(); + lightPlane.material.dispose(); + targetLine.geometry.dispose(); + targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.lookAt( v3 ); + lightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + targetLine.lookAt( v3 ); + targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 0x333333 ); + + // near + + addLine( "n1", "n2", colorFrustum ); + addLine( "n2", "n4", colorFrustum ); + addLine( "n4", "n3", colorFrustum ); + addLine( "n3", "n1", colorFrustum ); + + // far + + addLine( "f1", "f2", colorFrustum ); + addLine( "f2", "f4", colorFrustum ); + addLine( "f4", "f3", colorFrustum ); + addLine( "f3", "f1", colorFrustum ); + + // sides + + addLine( "n1", "f1", colorFrustum ); + addLine( "n2", "f2", colorFrustum ); + addLine( "n3", "f3", colorFrustum ); + addLine( "n4", "f4", colorFrustum ); + + // cone + + addLine( "p", "n1", colorCone ); + addLine( "p", "n2", colorCone ); + addLine( "p", "n3", colorCone ); + addLine( "p", "n4", colorCone ); + + // up + + addLine( "u1", "u2", colorUp ); + addLine( "u2", "u3", colorUp ); + addLine( "u3", "u1", colorUp ); + + // target + + addLine( "c", "t", colorTarget ); + addLine( "p", "c", colorCross ); + + // cross + + addLine( "cn1", "cn2", colorCross ); + addLine( "cn3", "cn4", colorCross ); + + addLine( "cf1", "cf2", colorCross ); + addLine( "cf3", "cf4", colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( "c", 0, 0, - 1 ); + setPoint( "t", 0, 0, 1 ); + + // near + + setPoint( "n1", - w, - h, - 1 ); + setPoint( "n2", w, - h, - 1 ); + setPoint( "n3", - w, h, - 1 ); + setPoint( "n4", w, h, - 1 ); + + // far + + setPoint( "f1", - w, - h, 1 ); + setPoint( "f2", w, - h, 1 ); + setPoint( "f3", - w, h, 1 ); + setPoint( "f4", w, h, 1 ); + + // up + + setPoint( "u1", w * 0.7, h * 1.1, - 1 ); + setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); + setPoint( "u3", 0, h * 2, - 1 ); + + // cross + + setPoint( "cf1", - w, 0, 1 ); + setPoint( "cf2", w, 0, 1 ); + setPoint( "cf3", 0, - h, 1 ); + setPoint( "cf4", 0, h, 1 ); + + setPoint( "cn1", - w, 0, - 1 ); + setPoint( "cn2", w, 0, - 1 ); + setPoint( "cn3", 0, - h, - 1 ); + setPoint( "cn4", 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BoxHelper( object, color ) { + + if ( color === undefined ) color = 0xffff00; + + var 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 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + if ( object !== undefined ) { + + this.update( object ); + + } + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object && object.isBox3 ) { + + box.copy( object ); + + } else { + + box.setFromObject( object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry; + var coneGeometry; + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxisHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxisHelper.prototype = Object.create( LineSegments.prototype ); + AxisHelper.prototype.constructor = AxisHelper; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + var tmp = new Vector3(); + var px = new CubicPoly(); + var py = new CubicPoly(); + var pz = new CubicPoly(); + + function CatmullRomCurve3( p /* array of Vector3 */ ) { + + this.points = p || []; + this.closed = false; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.getPoint = function ( t ) { + + var points = this.points; + var l = points.length; + + if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); + + var point = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.type === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.type === 'catmullrom' ) { + + var tension = this.tension !== undefined ? this.tension : 0.5; + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); + + } + + return new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) ); + + }; + + function CubicBezierCurve3( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + return new Vector3( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + }; + + function QuadraticBezierCurve3( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + return new Vector3( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + }; + + function LineCurve3( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var vector = new Vector3(); + + vector.subVectors( this.v2, this.v1 ); // diff + vector.multiplyScalar( t ); + vector.add( this.v1 ); + + return vector; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + var SceneUtils = { + + createMultiMaterialObject: function ( geometry, materials ) { + + var group = new Group(); + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + group.add( new Mesh( geometry, materials[ i ] ) ); + + } + + return group; + + }, + + detach: function ( child, parent, scene ) { + + child.applyMatrix( parent.matrixWorld ); + parent.remove( child ); + scene.add( child ); + + }, + + attach: function ( child, scene, parent ) { + + var matrixWorldInverse = new Matrix4(); + matrixWorldInverse.getInverse( parent.matrixWorld ); + child.applyMatrix( matrixWorldInverse ); + + scene.remove( child ); + parent.add( child ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + + } + + var LineStrip = 0; + + var LinePieces = 1; + + function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' ); + return new MultiMaterial( materials ); + + } + + function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + + } + + function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + + } + + // + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + + } + + function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + + } + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( a ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( optionalTarget ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( samplingCoef ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + // + function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + + } + + function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + // + + function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + + } + + function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + + } + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + _Math.random16 = function () { + + console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }; + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + applyToBuffer: function( buffer, offset, length ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function( array, offset, length ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function( buffer, offset, length ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function( array, offset, length ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }; + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + // + + Geometry.prototype.computeTangents = function () { + + console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }; + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + } + + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + + } + }, + wrapRGB: { + get: function () { + + console.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' ); + return new Color(); + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + return this.shadowMap.cullFace; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); + this.shadowMap.cullFace = value; + + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + return this.renderReverseSided ? CullFaceFront : CullFaceBack; + + }, + set: function ( cullFace ) { + + var value = ( cullFace !== CullFaceBack ); + console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." ); + this.renderReverseSided = value; + + } + } + + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + }; + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + var ImageUtils = { + + crossOrigin: undefined, + + loadTexture: function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadTextureCube: function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadCompressedTexture: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }, + + loadCompressedTextureCube: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + } + + }; + + // + + function Projector() { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + } + + // + + function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' ); + + this.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + this.clear = function () {}; + this.render = function () {}; + this.setClearColor = function () {}; + this.setSize = function () {}; + + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube; + exports.WebGLRenderTarget = WebGLRenderTarget; + exports.WebGLRenderer = WebGLRenderer; + exports.ShaderLib = ShaderLib; + exports.UniformsLib = UniformsLib; + exports.UniformsUtils = UniformsUtils; + exports.ShaderChunk = ShaderChunk; + exports.FogExp2 = FogExp2; + exports.Fog = Fog; + exports.Scene = Scene; + exports.LensFlare = LensFlare; + exports.Sprite = Sprite; + exports.LOD = LOD; + exports.SkinnedMesh = SkinnedMesh; + exports.Skeleton = Skeleton; + exports.Bone = Bone; + exports.Mesh = Mesh; + exports.LineSegments = LineSegments; + exports.Line = Line; + exports.Points = Points; + exports.Group = Group; + exports.VideoTexture = VideoTexture; + exports.DataTexture = DataTexture; + exports.CompressedTexture = CompressedTexture; + exports.CubeTexture = CubeTexture; + exports.CanvasTexture = CanvasTexture; + exports.DepthTexture = DepthTexture; + exports.Texture = Texture; + exports.CompressedTextureLoader = CompressedTextureLoader; + exports.DataTextureLoader = DataTextureLoader; + exports.CubeTextureLoader = CubeTextureLoader; + exports.TextureLoader = TextureLoader; + exports.ObjectLoader = ObjectLoader; + exports.MaterialLoader = MaterialLoader; + exports.BufferGeometryLoader = BufferGeometryLoader; + exports.DefaultLoadingManager = DefaultLoadingManager; + exports.LoadingManager = LoadingManager; + exports.JSONLoader = JSONLoader; + exports.ImageLoader = ImageLoader; + exports.FontLoader = FontLoader; + exports.FileLoader = FileLoader; + exports.Loader = Loader; + exports.Cache = Cache; + exports.AudioLoader = AudioLoader; + exports.SpotLightShadow = SpotLightShadow; + exports.SpotLight = SpotLight; + exports.PointLight = PointLight; + exports.RectAreaLight = RectAreaLight; + exports.HemisphereLight = HemisphereLight; + exports.DirectionalLightShadow = DirectionalLightShadow; + exports.DirectionalLight = DirectionalLight; + exports.AmbientLight = AmbientLight; + exports.LightShadow = LightShadow; + exports.Light = Light; + exports.StereoCamera = StereoCamera; + exports.PerspectiveCamera = PerspectiveCamera; + exports.OrthographicCamera = OrthographicCamera; + exports.CubeCamera = CubeCamera; + exports.Camera = Camera; + exports.AudioListener = AudioListener; + exports.PositionalAudio = PositionalAudio; + exports.AudioContext = AudioContext; + exports.AudioAnalyser = AudioAnalyser; + exports.Audio = Audio; + exports.VectorKeyframeTrack = VectorKeyframeTrack; + exports.StringKeyframeTrack = StringKeyframeTrack; + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; + exports.NumberKeyframeTrack = NumberKeyframeTrack; + exports.ColorKeyframeTrack = ColorKeyframeTrack; + exports.BooleanKeyframeTrack = BooleanKeyframeTrack; + exports.PropertyMixer = PropertyMixer; + exports.PropertyBinding = PropertyBinding; + exports.KeyframeTrack = KeyframeTrack; + exports.AnimationUtils = AnimationUtils; + exports.AnimationObjectGroup = AnimationObjectGroup; + exports.AnimationMixer = AnimationMixer; + exports.AnimationClip = AnimationClip; + exports.Uniform = Uniform; + exports.InstancedBufferGeometry = InstancedBufferGeometry; + exports.BufferGeometry = BufferGeometry; + exports.GeometryIdCount = GeometryIdCount; + exports.Geometry = Geometry; + exports.InterleavedBufferAttribute = InterleavedBufferAttribute; + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer; + exports.InterleavedBuffer = InterleavedBuffer; + exports.InstancedBufferAttribute = InstancedBufferAttribute; + exports.Face3 = Face3; + exports.Object3D = Object3D; + exports.Raycaster = Raycaster; + exports.Layers = Layers; + exports.EventDispatcher = EventDispatcher; + exports.Clock = Clock; + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; + exports.LinearInterpolant = LinearInterpolant; + exports.DiscreteInterpolant = DiscreteInterpolant; + exports.CubicInterpolant = CubicInterpolant; + exports.Interpolant = Interpolant; + exports.Triangle = Triangle; + exports.Math = _Math; + exports.Spherical = Spherical; + exports.Cylindrical = Cylindrical; + exports.Plane = Plane; + exports.Frustum = Frustum; + exports.Sphere = Sphere; + exports.Ray = Ray; + exports.Matrix4 = Matrix4; + exports.Matrix3 = Matrix3; + exports.Box3 = Box3; + exports.Box2 = Box2; + exports.Line3 = Line3; + exports.Euler = Euler; + exports.Vector4 = Vector4; + exports.Vector3 = Vector3; + exports.Vector2 = Vector2; + exports.Quaternion = Quaternion; + exports.Color = Color; + exports.MorphBlendMesh = MorphBlendMesh; + exports.ImmediateRenderObject = ImmediateRenderObject; + exports.VertexNormalsHelper = VertexNormalsHelper; + exports.SpotLightHelper = SpotLightHelper; + exports.SkeletonHelper = SkeletonHelper; + exports.PointLightHelper = PointLightHelper; + exports.RectAreaLightHelper = RectAreaLightHelper; + exports.HemisphereLightHelper = HemisphereLightHelper; + exports.GridHelper = GridHelper; + exports.PolarGridHelper = PolarGridHelper; + exports.FaceNormalsHelper = FaceNormalsHelper; + exports.DirectionalLightHelper = DirectionalLightHelper; + exports.CameraHelper = CameraHelper; + exports.BoxHelper = BoxHelper; + exports.ArrowHelper = ArrowHelper; + exports.AxisHelper = AxisHelper; + exports.CatmullRomCurve3 = CatmullRomCurve3; + exports.CubicBezierCurve3 = CubicBezierCurve3; + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3; + exports.LineCurve3 = LineCurve3; + exports.ArcCurve = ArcCurve; + exports.EllipseCurve = EllipseCurve; + exports.SplineCurve = SplineCurve; + exports.CubicBezierCurve = CubicBezierCurve; + exports.QuadraticBezierCurve = QuadraticBezierCurve; + exports.LineCurve = LineCurve; + exports.Shape = Shape; + exports.Path = Path; + exports.ShapePath = ShapePath; + exports.Font = Font; + exports.CurvePath = CurvePath; + exports.Curve = Curve; + exports.ShapeUtils = ShapeUtils; + exports.SceneUtils = SceneUtils; + exports.WireframeGeometry = WireframeGeometry; + exports.ParametricGeometry = ParametricGeometry; + exports.ParametricBufferGeometry = ParametricBufferGeometry; + exports.TetrahedronGeometry = TetrahedronGeometry; + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry; + exports.OctahedronGeometry = OctahedronGeometry; + exports.OctahedronBufferGeometry = OctahedronBufferGeometry; + exports.IcosahedronGeometry = IcosahedronGeometry; + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry; + exports.DodecahedronGeometry = DodecahedronGeometry; + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry; + exports.PolyhedronGeometry = PolyhedronGeometry; + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry; + exports.TubeGeometry = TubeGeometry; + exports.TubeBufferGeometry = TubeBufferGeometry; + exports.TorusKnotGeometry = TorusKnotGeometry; + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry; + exports.TorusGeometry = TorusGeometry; + exports.TorusBufferGeometry = TorusBufferGeometry; + exports.TextGeometry = TextGeometry; + exports.SphereGeometry = SphereGeometry; + exports.SphereBufferGeometry = SphereBufferGeometry; + exports.RingGeometry = RingGeometry; + exports.RingBufferGeometry = RingBufferGeometry; + exports.PlaneGeometry = PlaneGeometry; + exports.PlaneBufferGeometry = PlaneBufferGeometry; + exports.LatheGeometry = LatheGeometry; + exports.LatheBufferGeometry = LatheBufferGeometry; + exports.ShapeGeometry = ShapeGeometry; + exports.ShapeBufferGeometry = ShapeBufferGeometry; + exports.ExtrudeGeometry = ExtrudeGeometry; + exports.EdgesGeometry = EdgesGeometry; + exports.ConeGeometry = ConeGeometry; + exports.ConeBufferGeometry = ConeBufferGeometry; + exports.CylinderGeometry = CylinderGeometry; + exports.CylinderBufferGeometry = CylinderBufferGeometry; + exports.CircleGeometry = CircleGeometry; + exports.CircleBufferGeometry = CircleBufferGeometry; + exports.BoxGeometry = BoxGeometry; + exports.BoxBufferGeometry = BoxBufferGeometry; + exports.ShadowMaterial = ShadowMaterial; + exports.SpriteMaterial = SpriteMaterial; + exports.RawShaderMaterial = RawShaderMaterial; + exports.ShaderMaterial = ShaderMaterial; + exports.PointsMaterial = PointsMaterial; + exports.MultiMaterial = MultiMaterial; + exports.MeshPhysicalMaterial = MeshPhysicalMaterial; + exports.MeshStandardMaterial = MeshStandardMaterial; + exports.MeshPhongMaterial = MeshPhongMaterial; + exports.MeshToonMaterial = MeshToonMaterial; + exports.MeshNormalMaterial = MeshNormalMaterial; + exports.MeshLambertMaterial = MeshLambertMaterial; + exports.MeshDepthMaterial = MeshDepthMaterial; + exports.MeshBasicMaterial = MeshBasicMaterial; + exports.LineDashedMaterial = LineDashedMaterial; + exports.LineBasicMaterial = LineBasicMaterial; + exports.Material = Material; + exports.Float64BufferAttribute = Float64BufferAttribute; + exports.Float32BufferAttribute = Float32BufferAttribute; + exports.Uint32BufferAttribute = Uint32BufferAttribute; + exports.Int32BufferAttribute = Int32BufferAttribute; + exports.Uint16BufferAttribute = Uint16BufferAttribute; + exports.Int16BufferAttribute = Int16BufferAttribute; + exports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute; + exports.Uint8BufferAttribute = Uint8BufferAttribute; + exports.Int8BufferAttribute = Int8BufferAttribute; + exports.BufferAttribute = BufferAttribute; + exports.REVISION = REVISION; + exports.MOUSE = MOUSE; + exports.CullFaceNone = CullFaceNone; + exports.CullFaceBack = CullFaceBack; + exports.CullFaceFront = CullFaceFront; + exports.CullFaceFrontBack = CullFaceFrontBack; + exports.FrontFaceDirectionCW = FrontFaceDirectionCW; + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW; + exports.BasicShadowMap = BasicShadowMap; + exports.PCFShadowMap = PCFShadowMap; + exports.PCFSoftShadowMap = PCFSoftShadowMap; + exports.FrontSide = FrontSide; + exports.BackSide = BackSide; + exports.DoubleSide = DoubleSide; + exports.FlatShading = FlatShading; + exports.SmoothShading = SmoothShading; + exports.NoColors = NoColors; + exports.FaceColors = FaceColors; + exports.VertexColors = VertexColors; + exports.NoBlending = NoBlending; + exports.NormalBlending = NormalBlending; + exports.AdditiveBlending = AdditiveBlending; + exports.SubtractiveBlending = SubtractiveBlending; + exports.MultiplyBlending = MultiplyBlending; + exports.CustomBlending = CustomBlending; + exports.AddEquation = AddEquation; + exports.SubtractEquation = SubtractEquation; + exports.ReverseSubtractEquation = ReverseSubtractEquation; + exports.MinEquation = MinEquation; + exports.MaxEquation = MaxEquation; + exports.ZeroFactor = ZeroFactor; + exports.OneFactor = OneFactor; + exports.SrcColorFactor = SrcColorFactor; + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor; + exports.SrcAlphaFactor = SrcAlphaFactor; + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor; + exports.DstAlphaFactor = DstAlphaFactor; + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor; + exports.DstColorFactor = DstColorFactor; + exports.OneMinusDstColorFactor = OneMinusDstColorFactor; + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor; + exports.NeverDepth = NeverDepth; + exports.AlwaysDepth = AlwaysDepth; + exports.LessDepth = LessDepth; + exports.LessEqualDepth = LessEqualDepth; + exports.EqualDepth = EqualDepth; + exports.GreaterEqualDepth = GreaterEqualDepth; + exports.GreaterDepth = GreaterDepth; + exports.NotEqualDepth = NotEqualDepth; + exports.MultiplyOperation = MultiplyOperation; + exports.MixOperation = MixOperation; + exports.AddOperation = AddOperation; + exports.NoToneMapping = NoToneMapping; + exports.LinearToneMapping = LinearToneMapping; + exports.ReinhardToneMapping = ReinhardToneMapping; + exports.Uncharted2ToneMapping = Uncharted2ToneMapping; + exports.CineonToneMapping = CineonToneMapping; + exports.UVMapping = UVMapping; + exports.CubeReflectionMapping = CubeReflectionMapping; + exports.CubeRefractionMapping = CubeRefractionMapping; + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping; + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping; + exports.SphericalReflectionMapping = SphericalReflectionMapping; + exports.CubeUVReflectionMapping = CubeUVReflectionMapping; + exports.CubeUVRefractionMapping = CubeUVRefractionMapping; + exports.RepeatWrapping = RepeatWrapping; + exports.ClampToEdgeWrapping = ClampToEdgeWrapping; + exports.MirroredRepeatWrapping = MirroredRepeatWrapping; + exports.NearestFilter = NearestFilter; + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter; + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter; + exports.LinearFilter = LinearFilter; + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter; + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter; + exports.UnsignedByteType = UnsignedByteType; + exports.ByteType = ByteType; + exports.ShortType = ShortType; + exports.UnsignedShortType = UnsignedShortType; + exports.IntType = IntType; + exports.UnsignedIntType = UnsignedIntType; + exports.FloatType = FloatType; + exports.HalfFloatType = HalfFloatType; + exports.UnsignedShort4444Type = UnsignedShort4444Type; + exports.UnsignedShort5551Type = UnsignedShort5551Type; + exports.UnsignedShort565Type = UnsignedShort565Type; + exports.UnsignedInt248Type = UnsignedInt248Type; + exports.AlphaFormat = AlphaFormat; + exports.RGBFormat = RGBFormat; + exports.RGBAFormat = RGBAFormat; + exports.LuminanceFormat = LuminanceFormat; + exports.LuminanceAlphaFormat = LuminanceAlphaFormat; + exports.RGBEFormat = RGBEFormat; + exports.DepthFormat = DepthFormat; + exports.DepthStencilFormat = DepthStencilFormat; + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format; + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format; + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format; + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format; + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format; + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format; + exports.RGB_ETC1_Format = RGB_ETC1_Format; + exports.LoopOnce = LoopOnce; + exports.LoopRepeat = LoopRepeat; + exports.LoopPingPong = LoopPingPong; + exports.InterpolateDiscrete = InterpolateDiscrete; + exports.InterpolateLinear = InterpolateLinear; + exports.InterpolateSmooth = InterpolateSmooth; + exports.ZeroCurvatureEnding = ZeroCurvatureEnding; + exports.ZeroSlopeEnding = ZeroSlopeEnding; + exports.WrapAroundEnding = WrapAroundEnding; + exports.TrianglesDrawMode = TrianglesDrawMode; + exports.TriangleStripDrawMode = TriangleStripDrawMode; + exports.TriangleFanDrawMode = TriangleFanDrawMode; + exports.LinearEncoding = LinearEncoding; + exports.sRGBEncoding = sRGBEncoding; + exports.GammaEncoding = GammaEncoding; + exports.RGBEEncoding = RGBEEncoding; + exports.LogLuvEncoding = LogLuvEncoding; + exports.RGBM7Encoding = RGBM7Encoding; + exports.RGBM16Encoding = RGBM16Encoding; + exports.RGBDEncoding = RGBDEncoding; + exports.BasicDepthPacking = BasicDepthPacking; + exports.RGBADepthPacking = RGBADepthPacking; + exports.CubeGeometry = BoxGeometry; + exports.Face4 = Face4; + exports.LineStrip = LineStrip; + exports.LinePieces = LinePieces; + exports.MeshFaceMaterial = MeshFaceMaterial; + exports.PointCloud = PointCloud; + exports.Particle = Particle; + exports.ParticleSystem = ParticleSystem; + exports.PointCloudMaterial = PointCloudMaterial; + exports.ParticleBasicMaterial = ParticleBasicMaterial; + exports.ParticleSystemMaterial = ParticleSystemMaterial; + exports.Vertex = Vertex; + exports.DynamicBufferAttribute = DynamicBufferAttribute; + exports.Int8Attribute = Int8Attribute; + exports.Uint8Attribute = Uint8Attribute; + exports.Uint8ClampedAttribute = Uint8ClampedAttribute; + exports.Int16Attribute = Int16Attribute; + exports.Uint16Attribute = Uint16Attribute; + exports.Int32Attribute = Int32Attribute; + exports.Uint32Attribute = Uint32Attribute; + exports.Float32Attribute = Float32Attribute; + exports.Float64Attribute = Float64Attribute; + exports.ClosedSplineCurve3 = ClosedSplineCurve3; + exports.SplineCurve3 = SplineCurve3; + exports.Spline = Spline; + exports.BoundingBoxHelper = BoundingBoxHelper; + exports.EdgesHelper = EdgesHelper; + exports.WireframeHelper = WireframeHelper; + exports.XHRLoader = XHRLoader; + exports.BinaryTextureLoader = BinaryTextureLoader; + exports.GeometryUtils = GeometryUtils; + exports.ImageUtils = ImageUtils; + exports.Projector = Projector; + exports.CanvasRenderer = CanvasRenderer; + + Object.defineProperty(exports, '__esModule', { value: true }); + + }))); + + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = RayMarcher; + + var _proxy_geometry = __webpack_require__(5); + + var THREE = __webpack_require__(6); + var EffectComposer = __webpack_require__(8)(THREE); + + function RayMarcher(renderer, scene, camera) { + var composer = new EffectComposer(renderer); + var shaderPass = new EffectComposer.ShaderPass({ + uniforms: { + u_buffer: { + type: '4fv', + value: undefined + }, + u_count: { + type: 'i', + value: 0 + }, + u_debug: { + type: 'f', + value: 0 + }, + u_viewProjectionMatrix: { + type: 'm4', + value: new THREE.Matrix4() + }, + u_cameraPosition: { + type: 'v3', + value: new THREE.Vector3(0, 0, 0) + } + }, + vertexShader: __webpack_require__(14), + fragmentShader: __webpack_require__(15) + }); + shaderPass.renderToScreen = true; + composer.addPass(shaderPass); + + var inverseProjectionMatrix = new THREE.Matrix4(); + + return { + render: function render(buffer, camera, options) { + + shaderPass.material.uniforms.u_buffer.value = buffer; + shaderPass.material.uniforms.u_count.value = buffer.length / _proxy_geometry.PROXY_BUFFER_SIZE; + shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + + camera.updateMatrix(); + camera.updateProjectionMatrix(); + + inverseProjectionMatrix.getInverse(camera.projectionMatrix); + shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); + shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); + + composer.render(); + } + }; + } + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + module.exports = function(THREE) { + var CopyShader = EffectComposer.CopyShader = __webpack_require__(9) + , RenderPass = EffectComposer.RenderPass = __webpack_require__(10)(THREE) + , ShaderPass = EffectComposer.ShaderPass = __webpack_require__(11)(THREE, EffectComposer) + , MaskPass = EffectComposer.MaskPass = __webpack_require__(12)(THREE) + , ClearMaskPass = EffectComposer.ClearMaskPass = __webpack_require__(13)(THREE) + + function EffectComposer( renderer, renderTarget ) { + this.renderer = renderer; + + if ( renderTarget === undefined ) { + var width = window.innerWidth || 1; + var height = window.innerHeight || 1; + var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false }; + + renderTarget = new THREE.WebGLRenderTarget( width, height, parameters ); + } + + this.renderTarget1 = renderTarget; + this.renderTarget2 = renderTarget.clone(); + + this.writeBuffer = this.renderTarget1; + this.readBuffer = this.renderTarget2; + + this.passes = []; + + this.copyPass = new ShaderPass( CopyShader ); + }; + + EffectComposer.prototype = { + swapBuffers: function() { + + var tmp = this.readBuffer; + this.readBuffer = this.writeBuffer; + this.writeBuffer = tmp; + + }, + + addPass: function ( pass ) { + + this.passes.push( pass ); + + }, + + insertPass: function ( pass, index ) { + + this.passes.splice( index, 0, pass ); + + }, + + render: function ( delta ) { + + this.writeBuffer = this.renderTarget1; + this.readBuffer = this.renderTarget2; + + var maskActive = false; + + var pass, i, il = this.passes.length; + + for ( i = 0; i < il; i ++ ) { + + pass = this.passes[ i ]; + + if ( !pass.enabled ) continue; + + pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive ); + + if ( pass.needsSwap ) { + + if ( maskActive ) { + + var context = this.renderer.context; + + context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff ); + + this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta ); + + context.stencilFunc( context.EQUAL, 1, 0xffffffff ); + + } + + this.swapBuffers(); + + } + + if ( pass instanceof MaskPass ) { + + maskActive = true; + + } else if ( pass instanceof ClearMaskPass ) { + + maskActive = false; + + } + + } + + }, + + reset: function ( renderTarget ) { + + if ( renderTarget === undefined ) { + + renderTarget = this.renderTarget1.clone(); + + renderTarget.width = window.innerWidth; + renderTarget.height = window.innerHeight; + + } + + this.renderTarget1 = renderTarget; + this.renderTarget2 = renderTarget.clone(); + + this.writeBuffer = this.renderTarget1; + this.readBuffer = this.renderTarget2; + + }, + + setSize: function ( width, height ) { + + var renderTarget = this.renderTarget1.clone(); + + renderTarget.width = width; + renderTarget.height = height; + + this.reset( renderTarget ); + + } + + }; + + // shared ortho camera + + EffectComposer.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 ); + + EffectComposer.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null ); + + EffectComposer.scene = new THREE.Scene(); + EffectComposer.scene.add( EffectComposer.quad ); + + return EffectComposer + }; + +/***/ }, +/* 9 */ +/***/ function(module, exports) { + + /** + * @author alteredq / http://alteredqualia.com/ + * + * Full-screen textured quad shader + */ + + module.exports = { + uniforms: { + "tDiffuse": { type: "t", value: null }, + "opacity": { type: "f", value: 1.0 } + }, + vertexShader: [ + "varying vec2 vUv;", + + "void main() {", + + "vUv = uv;", + "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + "}" + ].join("\n"), + fragmentShader: [ + "uniform float opacity;", + + "uniform sampler2D tDiffuse;", + + "varying vec2 vUv;", + + "void main() {", + + "vec4 texel = texture2D( tDiffuse, vUv );", + "gl_FragColor = opacity * texel;", + + "}" + ].join("\n") + }; + + +/***/ }, +/* 10 */ +/***/ function(module, exports) { + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + module.exports = function(THREE) { + function RenderPass( scene, camera, overrideMaterial, clearColor, clearAlpha ) { + if (!(this instanceof RenderPass)) return new RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha); + + this.scene = scene; + this.camera = camera; + + this.overrideMaterial = overrideMaterial; + + this.clearColor = clearColor; + this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1; + + this.oldClearColor = new THREE.Color(); + this.oldClearAlpha = 1; + + this.enabled = true; + this.clear = true; + this.needsSwap = false; + + }; + + RenderPass.prototype = { + + render: function ( renderer, writeBuffer, readBuffer, delta ) { + + this.scene.overrideMaterial = this.overrideMaterial; + + if ( this.clearColor ) { + + this.oldClearColor.copy( renderer.getClearColor() ); + this.oldClearAlpha = renderer.getClearAlpha(); + + renderer.setClearColor( this.clearColor, this.clearAlpha ); + + } + + renderer.render( this.scene, this.camera, readBuffer, this.clear ); + + if ( this.clearColor ) { + + renderer.setClearColor( this.oldClearColor, this.oldClearAlpha ); + + } + + this.scene.overrideMaterial = null; + + } + + }; + + return RenderPass; + + }; + + +/***/ }, +/* 11 */ +/***/ function(module, exports) { + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + module.exports = function(THREE, EffectComposer) { + function ShaderPass( shader, textureID ) { + if (!(this instanceof ShaderPass)) return new ShaderPass(shader, textureID); + + this.textureID = ( textureID !== undefined ) ? textureID : "tDiffuse"; + + this.uniforms = THREE.UniformsUtils.clone( shader.uniforms ); + + this.material = new THREE.ShaderMaterial( { + + uniforms: this.uniforms, + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + + } ); + + this.renderToScreen = false; + + this.enabled = true; + this.needsSwap = true; + this.clear = false; + + }; + + ShaderPass.prototype = { + + render: function ( renderer, writeBuffer, readBuffer, delta ) { + + if ( this.uniforms[ this.textureID ] ) { + + this.uniforms[ this.textureID ].value = readBuffer; + + } + + EffectComposer.quad.material = this.material; + + if ( this.renderToScreen ) { + + renderer.render( EffectComposer.scene, EffectComposer.camera ); + + } else { + + renderer.render( EffectComposer.scene, EffectComposer.camera, writeBuffer, this.clear ); + + } + + } + + }; + + return ShaderPass; + + }; + +/***/ }, +/* 12 */ +/***/ function(module, exports) { + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + module.exports = function(THREE) { + function MaskPass( scene, camera ) { + if (!(this instanceof MaskPass)) return new MaskPass(scene, camera); + + this.scene = scene; + this.camera = camera; + + this.enabled = true; + this.clear = true; + this.needsSwap = false; + + this.inverse = false; + }; + + MaskPass.prototype = { + + render: function ( renderer, writeBuffer, readBuffer, delta ) { + + var context = renderer.context; + + // don't update color or depth + + context.colorMask( false, false, false, false ); + context.depthMask( false ); + + // set up stencil + + var writeValue, clearValue; + + if ( this.inverse ) { + + writeValue = 0; + clearValue = 1; + + } else { + + writeValue = 1; + clearValue = 0; + + } + + context.enable( context.STENCIL_TEST ); + context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE ); + context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff ); + context.clearStencil( clearValue ); + + // draw into the stencil buffer + + renderer.render( this.scene, this.camera, readBuffer, this.clear ); + renderer.render( this.scene, this.camera, writeBuffer, this.clear ); + + // re-enable update of color and depth + + context.colorMask( true, true, true, true ); + context.depthMask( true ); + + // only render where stencil is set to 1 + + context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1 + context.stencilOp( context.KEEP, context.KEEP, context.KEEP ); + + } + + }; + + return MaskPass + }; + + +/***/ }, +/* 13 */ +/***/ function(module, exports) { + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + module.exports = function(THREE) { + function ClearMaskPass() { + if (!(this instanceof ClearMaskPass)) return new ClearMaskPass(scene, camera); + this.enabled = true; + }; + + ClearMaskPass.prototype = { + render: function ( renderer, writeBuffer, readBuffer, delta ) { + var context = renderer.context; + context.disable( context.STENCIL_TEST ); + } + }; + + return ClearMaskPass + }; + +/***/ }, +/* 14 */ +/***/ function(module, exports) { + + module.exports = "varying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\nvoid main() {\r\n\tvec2 tmp = vec2(uv.x, uv.y);\r\n tmp = (tmp * 2.0) - vec2(1.0);\r\n f_ndcP = vec4(tmp, 1.0, 1.0) * 1000.0;\r\n f_uv = uv;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}" + +/***/ }, +/* 15 */ +/***/ function(module, exports) { + + module.exports = "#define MAX_GEOMETRY_COUNT 100\r\n#define FAR_CLIP 1000.0\r\n#define SHADOW_ITERATIONS 64\r\n#define MAX_ITERATIONS 100\r\n#define EPSILON 0.005\r\n\r\n/* This is how I'm packing the data\r\nstruct geometry_t {\r\n vec3 position;\r\n float type;\r\n};\r\n*/\r\n\r\nstruct Ray {\r\n\tvec3 position;\r\n\tvec3 direction;\r\n};\r\n\r\nuniform mat4 u_viewProjectionMatrix;\r\nuniform vec3 u_cameraPosition;\r\n\r\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\r\nuniform int u_count;\r\n\r\nuniform float u_debug;\r\n\r\nvarying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\r\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\r\n{\r\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\r\n}\r\n\r\nvec3 debugIterations(float factor)\r\n{\r\n\tvec3 a = vec3(0.478, 0.500, 0.500);\r\n\tvec3 b = vec3(0.500);\r\n\tvec3 c = vec3(0.688, 0.748, 0.748);\r\n\tvec3 d = vec3(0.318, 0.588, 0.908);\r\n\r\n\treturn palette(factor, a, b, c, d);\r\n}\r\n\r\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\r\nfloat sdSphere( vec3 p, float s )\r\n{\r\n\treturn length(p) - s;\r\n}\r\n\r\nfloat udBox( vec3 p, vec3 b )\r\n{\r\n\treturn length(max(abs(p) - b, 0.0));\r\n}\r\n\r\nfloat sdPlane( vec3 p, vec4 n )\r\n{\r\n // n must be normalized\r\n return dot(p,n.xyz) + n.w;\r\n}\r\n\r\nfloat udRoundBox( vec3 p, vec3 b, float r )\r\n{\r\n\treturn length(max(abs(p) - b, 0.0)) - r;\r\n}\r\n\r\nfloat sdCappedCone( in vec3 p, in vec3 c )\r\n{\r\n\tp.y -= .25;\r\n vec2 q = vec2( length(p.xz), p.y );\r\n vec2 v = vec2( c.z*c.y/c.x, -c.z );\r\n vec2 w = v - q;\r\n vec2 vv = vec2( dot(v,v), v.x*v.x );\r\n vec2 qv = vec2( dot(v,w), v.x*w.x );\r\n vec2 d = max(qv,0.0)*qv/vv;\r\n return sqrt( dot(w,w) - max(d.x,d.y) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\r\n}\r\n\r\nRay getRay()\r\n{\r\n\tRay ray;\r\n\tray.position = u_cameraPosition;\r\n\tray.direction = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - ray.position);\r\n\treturn ray;\r\n}\r\n\r\nfloat evaluateGeometrySDF(vec3 point, vec4 geo)\r\n{\r\n\tvec3 localPoint = point - geo.xyz;\r\n\r\n if(geo.w == 0.0)\r\n \treturn udBox(localPoint, vec3(.5));\r\n\telse if(geo.w == 1.0)\r\n\t\treturn sdSphere(localPoint, 1.0);\r\n\telse if(geo.w == 2.0)\r\n\t\treturn sdCappedCone(localPoint * .5, normalize(vec3(1.0)));\r\n\telse if(geo.w == 3.0)\r\n\t\treturn sdPlane(localPoint, vec4(0.0, 1.0, 0.0, 0.0));\r\n\r\n\treturn FAR_CLIP;\r\n}\r\n\r\n// This method is useful for just the distance\r\nfloat evaluateSceneSDFSimple(vec3 point)\r\n{\r\n\tfloat minDistance = FAR_CLIP;\r\n\r\n \tfor (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \r\n {\r\n if (i >= u_count)\r\n break;\r\n\r\n vec4 geo = u_buffer[i];\r\n float d = evaluateGeometrySDF(point, geo);\r\n\r\n \tif(d < minDistance)\r\n \t\tminDistance = d;\r\n }\r\n\r\n return minDistance;\r\n}\r\n\r\n// Assumes minDistance was initialized to FAR_CLIP\r\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\r\n{\t\r\n\tminDistance = FAR_CLIP;\r\n\r\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \r\n {\r\n if (i >= u_count)\r\n break;\r\n\r\n vec4 geo = u_buffer[i];\r\n\t\tfloat d = evaluateGeometrySDF(point, geo);\r\n \r\n \tif(d < minDistance)\r\n \t\tminDistance = d;\r\n }\r\n}\r\n\r\nvec3 estimateSceneGradient(vec3 point, float epsilon)\r\n{\r\n\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\r\n\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\r\n\r\n\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\r\n\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\r\n\r\n\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\r\n\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\r\n\r\n\treturn normalize(vec3(x,y,z));\r\n}\r\n\r\n\r\nfloat evaluateShadows(vec3 point, vec3 light)\r\n{\r\n\tRay ray;\r\n\tray.position = point;\r\n\tray.direction = (light - point);\r\n\r\n\tfloat maxDistance = length(ray.direction);\r\n\tray.direction = normalize(ray.direction);\r\n\r\n float t = 0.0;\r\n vec3 current = ray.position;\r\n\r\n\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = evaluateSceneSDFSimple(current);\r\n\r\n\t\tif(d < EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\r\n\t\tif(t > maxDistance)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\treturn 1.0 - smoothstep(t, t + .5, maxDistance);\r\n}\r\n\r\nvoid main() \r\n{\r\n\tRay ray = getRay();\r\n\r\n vec3 color;\r\n vec3 current = ray.position;\r\n float t = 0.0;\r\n float iterationCount = 0.0;\r\n\r\n\tfor(int j = 0; j < MAX_ITERATIONS; j++)\r\n\t{\r\n\t\tfloat d = FAR_CLIP;\r\n\t\tevaluateSceneSDF(current, d);\r\n\r\n\t\tif(d < EPSILON)\r\n\t\t{\r\n\t\t\tvec3 normal = estimateSceneGradient(current, EPSILON);\r\n\r\n\t\t\tvec3 light = vec3(0.0, 4.0, 3.0);\r\n\t\t\tvec3 l = light - current;\r\n\r\n\t\t\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\r\n\t\t\tfloat diffuse = clamp(dot(normal, normalize(l)) * falloff, 0.0, 1.0);\r\n\t\t\tfloat shadow = evaluateShadows(current + normal * .05, light);\r\n\r\n\t\t\tcolor = vec3(diffuse * shadow);\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tcolor = pow(color, vec3(.45454));\r\n\r\n\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS));\r\n\tcolor = mix(color, debugColor, u_debug);\r\n\r\n gl_FragColor = vec4(color, 1.0);\r\n}" + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__.p + "index.html"; + +/***/ }, +/* 17 */ +/***/ function(module, exports) { + + module.exports = function( THREE ) { + /** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + + // This set of controls performs orbiting, dollying (zooming), and panning. + // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). + // + // Orbit - left mouse / touch: one finger move + // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish + // Pan - right mouse, or arrow keys / touch: three finter swipe + + function OrbitControls( object, domElement ) { + + this.object = object; + + this.domElement = ( domElement !== undefined ) ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new THREE.Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return spherical.phi; + + }; + + this.getAzimuthalAngle = function () { + + return spherical.theta; + + }; + + this.reset = function () { + + scope.target.copy( scope.target0 ); + scope.object.position.copy( scope.position0 ); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent( changeEvent ); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function() { + + var offset = new THREE.Vector3(); + + // so camera.up is the orbit axis + var quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) ); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new THREE.Vector3(); + var lastQuaternion = new THREE.Quaternion(); + + return function update () { + + var position = scope.object.position; + + offset.copy( position ).sub( scope.target ); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion( quat ); + + // angle from z-axis around y-axis + spherical.setFromVector3( offset ); + + if ( scope.autoRotate && state === STATE.NONE ) { + + rotateLeft( getAutoRotationAngle() ); + + } + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + // restrict theta to be between desired limits + spherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) ); + + // restrict phi to be between desired limits + spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) ); + + spherical.makeSafe(); + + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) ); + + // move target to panned location + scope.target.add( panOffset ); + + offset.setFromSpherical( spherical ); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion( quatInverse ); + + position.copy( scope.target ).add( offset ); + + scope.object.lookAt( scope.target ); + + if ( scope.enableDamping === true ) { + + sphericalDelta.theta *= ( 1 - scope.dampingFactor ); + sphericalDelta.phi *= ( 1 - scope.dampingFactor ); + + } else { + + sphericalDelta.set( 0, 0, 0 ); + + } + + scale = 1; + panOffset.set( 0, 0, 0 ); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( zoomChanged || + lastPosition.distanceToSquared( scope.object.position ) > EPS || + 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) { + + scope.dispatchEvent( changeEvent ); + + lastPosition.copy( scope.object.position ); + lastQuaternion.copy( scope.object.quaternion ); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function() { + + scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false ); + scope.domElement.removeEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.removeEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.removeEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.removeEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.removeEventListener( 'touchmove', onTouchMove, false ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + window.removeEventListener( 'keydown', onKeyDown, false ); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new THREE.Spherical(); + var sphericalDelta = new THREE.Spherical(); + + var scale = 1; + var panOffset = new THREE.Vector3(); + var zoomChanged = false; + + var rotateStart = new THREE.Vector2(); + var rotateEnd = new THREE.Vector2(); + var rotateDelta = new THREE.Vector2(); + + var panStart = new THREE.Vector2(); + var panEnd = new THREE.Vector2(); + var panDelta = new THREE.Vector2(); + + var dollyStart = new THREE.Vector2(); + var dollyEnd = new THREE.Vector2(); + var dollyDelta = new THREE.Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function rotateLeft( angle ) { + + sphericalDelta.theta -= angle; + + } + + function rotateUp( angle ) { + + sphericalDelta.phi -= angle; + + } + + var panLeft = function() { + + var v = new THREE.Vector3(); + + return function panLeft( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix + v.multiplyScalar( - distance ); + + panOffset.add( v ); + + }; + + }(); + + var panUp = function() { + + var v = new THREE.Vector3(); + + return function panUp( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix + v.multiplyScalar( distance ); + + panOffset.add( v ); + + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = function() { + + var offset = new THREE.Vector3(); + + return function pan ( deltaX, deltaY ) { + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + // perspective + var position = scope.object.position; + offset.copy( position ).sub( scope.target ); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix ); + panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix ); + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + // orthographic + panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix ); + panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix ); + + } else { + + // camera neither orthographic nor perspective + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyIn( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale /= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + function dollyOut( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale *= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate( event ) { + + //console.log( 'handleMouseDownRotate' ); + + rotateStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownDolly( event ) { + + //console.log( 'handleMouseDownDolly' ); + + dollyStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownPan( event ) { + + //console.log( 'handleMouseDownPan' ); + + panStart.set( event.clientX, event.clientY ); + + } + + function handleMouseMoveRotate( event ) { + + //console.log( 'handleMouseMoveRotate' ); + + rotateEnd.set( event.clientX, event.clientY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleMouseMoveDolly( event ) { + + //console.log( 'handleMouseMoveDolly' ); + + dollyEnd.set( event.clientX, event.clientY ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyIn( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyOut( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleMouseMovePan( event ) { + + //console.log( 'handleMouseMovePan' ); + + panEnd.set( event.clientX, event.clientY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleMouseUp( event ) { + + //console.log( 'handleMouseUp' ); + + } + + function handleMouseWheel( event ) { + + //console.log( 'handleMouseWheel' ); + + if ( event.deltaY < 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( event.deltaY > 0 ) { + + dollyIn( getZoomScale() ); + + } + + scope.update(); + + } + + function handleKeyDown( event ) { + + //console.log( 'handleKeyDown' ); + + switch ( event.keyCode ) { + + case scope.keys.UP: + pan( 0, scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.BOTTOM: + pan( 0, - scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.LEFT: + pan( scope.keyPanSpeed, 0 ); + scope.update(); + break; + + case scope.keys.RIGHT: + pan( - scope.keyPanSpeed, 0 ); + scope.update(); + break; + + } + + } + + function handleTouchStartRotate( event ) { + + //console.log( 'handleTouchStartRotate' ); + + rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchStartDolly( event ) { + + //console.log( 'handleTouchStartDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyStart.set( 0, distance ); + + } + + function handleTouchStartPan( event ) { + + //console.log( 'handleTouchStartPan' ); + + panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchMoveRotate( event ) { + + //console.log( 'handleTouchMoveRotate' ); + + rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleTouchMoveDolly( event ) { + + //console.log( 'handleTouchMoveDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyIn( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleTouchMovePan( event ) { + + //console.log( 'handleTouchMovePan' ); + + panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleTouchEnd( event ) { + + //console.log( 'handleTouchEnd' ); + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( event.button === scope.mouseButtons.ORBIT ) { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } else if ( event.button === scope.mouseButtons.ZOOM ) { + + if ( scope.enableZoom === false ) return; + + handleMouseDownDolly( event ); + + state = STATE.DOLLY; + + } else if ( event.button === scope.mouseButtons.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } + + if ( state !== STATE.NONE ) { + + document.addEventListener( 'mousemove', onMouseMove, false ); + document.addEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( startEvent ); + + } + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( state === STATE.ROTATE ) { + + if ( scope.enableRotate === false ) return; + + handleMouseMoveRotate( event ); + + } else if ( state === STATE.DOLLY ) { + + if ( scope.enableZoom === false ) return; + + handleMouseMoveDolly( event ); + + } else if ( state === STATE.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseMovePan( event ); + + } + + } + + function onMouseUp( event ) { + + if ( scope.enabled === false ) return; + + handleMouseUp( event ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + + if ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return; + + event.preventDefault(); + event.stopPropagation(); + + handleMouseWheel( event ); + + scope.dispatchEvent( startEvent ); // not sure why these are here... + scope.dispatchEvent( endEvent ); + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return; + + handleKeyDown( event ); + + } + + function onTouchStart( event ) { + + if ( scope.enabled === false ) return; + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + + handleTouchStartRotate( event ); + + state = STATE.TOUCH_ROTATE; + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + + handleTouchStartDolly( event ); + + state = STATE.TOUCH_DOLLY; + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + + handleTouchStartPan( event ); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( startEvent ); + + } + + } + + function onTouchMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?... + + handleTouchMoveRotate( event ); + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + if ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?... + + handleTouchMoveDolly( event ); + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + if ( state !== STATE.TOUCH_PAN ) return; // is this needed?... + + handleTouchMovePan( event ); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd( event ) { + + if ( scope.enabled === false ) return; + + handleTouchEnd( event ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onContextMenu( event ) { + + event.preventDefault(); + + } + + // + + scope.domElement.addEventListener( 'contextmenu', onContextMenu, false ); + + scope.domElement.addEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.addEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.addEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.addEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.addEventListener( 'touchmove', onTouchMove, false ); + + window.addEventListener( 'keydown', onKeyDown, false ); + + // force an update at start + + this.update(); + + }; + + OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype ); + OrbitControls.prototype.constructor = OrbitControls; + + Object.defineProperties( OrbitControls.prototype, { + + center: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .center has been renamed to .target' ); + return this.target; + + } + + }, + + // backward compatibility + + noZoom: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + return ! this.enableZoom; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + this.enableZoom = ! value; + + } + + }, + + noRotate: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + return ! this.enableRotate; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + this.enableRotate = ! value; + + } + + }, + + noPan: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + return ! this.enablePan; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + this.enablePan = ! value; + + } + + }, + + noKeys: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + return ! this.enableKeys; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + this.enableKeys = ! value; + + } + + }, + + staticMoving : { + + get: function () { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + return ! this.enableDamping; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + this.enableDamping = ! value; + + } + + }, + + dynamicDampingFactor : { + + get: function () { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + return this.dampingFactor; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + this.dampingFactor = value; + + } + + } + + } ); + + return OrbitControls; + }; + + +/***/ } +/******/ ]); +//# sourceMappingURL=bundle.js.map \ No newline at end of file diff --git a/build/bundle.js.map b/build/bundle.js.map new file mode 100644 index 0000000..a6b0409 --- /dev/null +++ b/build/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap 4e0c33792ffe78e7a37e","webpack:///./src/main.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./src/proxy_geometry.js","webpack:///./~/three/build/three.js","webpack:///./src/rayMarching.js","webpack:///./~/three-effectcomposer/index.js","webpack:///./~/three-copyshader/index.js","webpack:///./~/three-effectcomposer/lib/renderpass.js","webpack:///./~/three-effectcomposer/lib/shaderpass.js","webpack:///./~/three-effectcomposer/lib/maskpass.js","webpack:///./~/three-effectcomposer/lib/clearmaskpass.js","webpack:///./src/glsl/pass-vert.glsl","webpack:///./src/glsl/rayMarch-frag.glsl","webpack:///./index.html","webpack:///./~/three-orbit-controls/index.js"],"names":["require","THREE","OrbitControls","BoxGeometry","SphereGeometry","ConeGeometry","PlaneGeometry","window","addEventListener","stats","setMode","domElement","style","position","left","top","document","body","appendChild","scene","Scene","camera","PerspectiveCamera","innerWidth","innerHeight","renderer","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","controls","enableDamping","enableZoom","rotateSpeed","zoomSpeed","panSpeed","aspect","updateProjectionMatrix","gui","GUI","options","strategy","debug","add","AxisHelper","DirectionalLight","proxyGeometry","boxMesh","Mesh","sphereMesh","coneMesh","planeMesh","rotateX","Math","PI","set","group","lookAt","Vector3","target","rayMarcher","tick","update","begin","render","buffer","end","requestAnimationFrame","ProxyMaterial","MeshLambertMaterial","color","PROXY_BUFFER_SIZE","ProxyGeometry","bounds","Group","_buffer","Float32Array","mesh","children","length","computeBuffer","remove","t","i","child","x","y","z","geometry","RayMarcher","EffectComposer","composer","shaderPass","ShaderPass","uniforms","u_buffer","type","value","undefined","u_count","u_debug","u_viewProjectionMatrix","Matrix4","u_cameraPosition","vertexShader","fragmentShader","renderToScreen","addPass","inverseProjectionMatrix","material","updateMatrix","getInverse","projectionMatrix","matrix","clone","multiply"],"mappings":"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ACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA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A;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA,mB;;;;;;AC3kHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA,sBAAqB,mGAAmG,aAAa,2CAA2C,mBAAmB,SAAS,KAAK,4BAA4B,YAAY,gBAAgB,oCAAoC,WAAW,qCAAqC,gBAAgB,uBAAuB,iBAAiB,oCAAoC,eAAe,4BAA4B,uCAAuC,cAAc,iBAAiB;AAC1iB,mBAAkB,iBAAiB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;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yBAAwB,0BAA0B;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA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AEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAE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AEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IA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AEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AA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A;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAE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;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AA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A;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAqB,eAAe;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;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4CAA4C;;AAEzI;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,cAAc;;AAE7D,EAAC;;;;;;;;;;;;mBC9x0CuBiB,U;;AAFxB;;AAHA,KAAM1F,QAAQ,mBAAAD,CAAQ,CAAR,CAAd;AACA,KAAM4F,iBAAiB,mBAAA5F,CAAQ,CAAR,EAAgCC,KAAhC,CAAvB;;AAIe,UAAS0F,UAAT,CAAoBlE,QAApB,EAA8BN,KAA9B,EAAqCE,MAArC,EAA6C;AACxD,SAAIwE,WAAW,IAAID,cAAJ,CAAmBnE,QAAnB,CAAf;AACA,SAAIqE,aAAa,IAAIF,eAAeG,UAAnB,CAA8B;AAC3CC,mBAAU;AACNC,uBAAU;AACNC,uBAAM,KADA;AAENC,wBAAOC;AAFD,cADJ;AAKNC,sBAAS;AACLH,uBAAM,GADD;AAELC,wBAAO;AAFF,cALH;AASNG,sBAAS;AACLJ,uBAAM,GADD;AAELC,wBAAO;AAFF,cATH;AAaNI,qCAAyB;AACrBL,uBAAM,IADe;AAErBC,wBAAO,IAAIlG,MAAMuG,OAAV;AAFc,cAbnB;AAiBNC,+BAAmB;AACfP,uBAAM,IADS;AAEfC,wBAAO,IAAIlG,MAAM2D,OAAV,CAAkB,C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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4e0c33792ffe78e7a37e","require('file-loader?name=[name].[ext]!../index.html');\r\n\r\nconst THREE = require('three');\r\nconst OrbitControls = require('three-orbit-controls')(THREE)\r\n\r\nimport DAT from 'dat-gui'\r\nimport Stats from 'stats-js'\r\nimport ProxyGeometry, {ProxyMaterial} from './proxy_geometry'\r\nimport RayMarcher from './rayMarching'\r\n\r\nvar BoxGeometry = new THREE.BoxGeometry(1, 1, 1);\r\nvar SphereGeometry = new THREE.SphereGeometry(1, 32, 32);\r\nvar ConeGeometry = new THREE.ConeGeometry(1, 1);\r\nvar PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 );\r\n\r\nwindow.addEventListener('load', function() {\r\n var stats = new Stats();\r\n stats.setMode(1);\r\n stats.domElement.style.position = 'absolute';\r\n stats.domElement.style.left = '0px';\r\n stats.domElement.style.top = '0px';\r\n document.body.appendChild(stats.domElement);\r\n\r\n var scene = new THREE.Scene();\r\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\r\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n renderer.setClearColor(0x999999, 1.0);\r\n document.body.appendChild(renderer.domElement);\r\n\r\n var controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.enableZoom = true;\r\n controls.rotateSpeed = 0.3;\r\n controls.zoomSpeed = 1.0;\r\n controls.panSpeed = 2.0;\r\n\r\n window.addEventListener('resize', function() {\r\n camera.aspect = window.innerWidth / window.innerHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n });\r\n\r\n var gui = new DAT.GUI();\r\n\r\n var options = {\r\n strategy: 'Ray Marching',\r\n debug : false\r\n }\r\n\r\n gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching']);\r\n gui.add(options, 'debug');\r\n\r\n scene.add(new THREE.AxisHelper(20));\r\n scene.add(new THREE.DirectionalLight(0xffffff, 1));\r\n\r\n var proxyGeometry = new ProxyGeometry();\r\n\r\n var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial);\r\n var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial);\r\n var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial);\r\n var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial);\r\n\r\n \r\n planeMesh.rotateX(Math.PI * -.5);\r\n planeMesh.position.set(0, -1, 0);\r\n boxMesh.position.set(-3, 0, 0);\r\n coneMesh.position.set(3, 0, 0);\r\n\r\n proxyGeometry.add(boxMesh);\r\n proxyGeometry.add(sphereMesh);\r\n proxyGeometry.add(coneMesh);\r\n proxyGeometry.add(planeMesh);\r\n\r\n scene.add(proxyGeometry.group);\r\n\r\n camera.position.set(5, 10, 15);\r\n camera.lookAt(new THREE.Vector3(0,0,0));\r\n controls.target.set(0,0,0);\r\n \r\n var rayMarcher = new RayMarcher(renderer, scene, camera);\r\n\r\n (function tick() {\r\n controls.update();\r\n stats.begin();\r\n proxyGeometry.update();\r\n\r\n if (options.strategy === 'Proxy Geometry') {\r\n renderer.render(scene, camera);\r\n } else if (options.strategy === 'Ray Marching') {\r\n rayMarcher.render(proxyGeometry.buffer, camera, options);\r\n }\r\n stats.end();\r\n requestAnimationFrame(tick);\r\n })();\r\n});\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 1\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 2\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 3\n// module chunks = 0","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 4\n// module chunks = 0","const THREE = require('three');\r\n\r\nexport var ProxyMaterial = new THREE.MeshLambertMaterial({\r\n color: 0xff0000\r\n});\r\n\r\nexport const PROXY_BUFFER_SIZE = 4;\r\n\r\nexport default class ProxyGeometry {\r\n constructor(bounds) {\r\n this.group = new THREE.Group();\r\n this._buffer = new Float32Array();\r\n }\r\n\r\n add(mesh) {\r\n this.group.add(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n remove(mesh) {\r\n this.group.remove(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n update(t = 1/60) {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n // TODO: animate objects\r\n }\r\n this.computeBuffer();\r\n }\r\n\r\n computeBuffer() {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n this._buffer[PROXY_BUFFER_SIZE*i] = child.position.x;\r\n this._buffer[PROXY_BUFFER_SIZE*i+1] = child.position.y;\r\n this._buffer[PROXY_BUFFER_SIZE*i+2] = child.position.z;\r\n\r\n if (child.geometry instanceof THREE.BoxGeometry) {\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = 0;\r\n } else if (child.geometry instanceof THREE.SphereGeometry) {\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = 1;\r\n } else if (child.geometry instanceof THREE.ConeGeometry) {\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = 2;\r\n } else if (child.geometry instanceof THREE.PlaneGeometry) {\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = 3;\r\n }\r\n }\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/proxy_geometry.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tEventDispatcher.prototype = {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tvar REVISION = '84';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tvar textureId = 0;\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\t\tthis.x = ( m32 - m23 ) / s;\n\t\t\tthis.y = ( m13 - m31 ) / s;\n\t\t\tthis.z = ( m21 - m12 ) / s;\n\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\t\t\tthis.w = attribute.getW( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tWebGLRenderTarget.prototype = {\n\n\t\tconstructor: WebGLRenderTarget,\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\t\t\tvar w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ];\n\n\t\t\treturn this.divideScalar( w );\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCylindrical: function( c ) {\n\n\t\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\t\tthis.y = c.y;\n\t\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeShear: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, y, z, 0,\n\t\t\t\tx, 1, z, 0,\n\t\t\t\tx, y, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tif ( far === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"float 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}\\nvec2 ltcTextureCoords( const in GeometricContext geometry, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = (LUT_SIZE - 1.0)/LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5/LUT_SIZE;\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\\n\\tint config = 0;\\n\\tif ( L[0].z > 0.0 ) config += 1;\\n\\tif ( L[1].z > 0.0 ) config += 2;\\n\\tif ( L[2].z > 0.0 ) config += 4;\\n\\tif ( L[3].z > 0.0 ) config += 8;\\n\\tn = 0;\\n\\tif ( config == 0 ) {\\n\\t} else if ( config == 1 ) {\\n\\t\\tn = 3;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 2 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 3 ) {\\n\\t\\tn = 4;\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t\\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 4 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t} else if ( config == 5 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 6 ) {\\n\\t\\tn = 4;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 7 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 8 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = L[3];\\n\\t} else if ( config == 9 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t} else if ( config == 10 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 11 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 12 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t} else if ( config == 13 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = L[2];\\n\\t\\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t} else if ( config == 14 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t} else if ( config == 15 ) {\\n\\t\\tn = 4;\\n\\t}\\n\\tif ( n == 3 )\\n\\t\\tL[3] = L[0];\\n\\tif ( n == 4 )\\n\\t\\tL[4] = L[0];\\n}\\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\\n\\tfloat cosTheta = dot( v1, v2 );\\n\\tfloat theta = acos( cosTheta );\\n\\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\\n\\treturn res;\\n}\\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\\n\\trectPoints[0] = pos - halfWidth - halfHeight;\\n\\trectPoints[1] = pos + halfWidth - halfHeight;\\n\\trectPoints[2] = pos + halfWidth + halfHeight;\\n\\trectPoints[3] = pos - halfWidth + halfHeight;\\n}\\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tvec3 T1, T2;\\n\\tT1 = normalize(V - N * dot( V, N ));\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\\n\\tvec3 clippedRect[5];\\n\\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\\n\\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\\n\\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\\n\\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\\n\\tint n;\\n\\tclipQuadToHorizon(clippedRect, n);\\n\\tif ( n == 0 )\\n\\t\\treturn vec3( 0, 0, 0 );\\n\\tclippedRect[0] = normalize( clippedRect[0] );\\n\\tclippedRect[1] = normalize( clippedRect[1] );\\n\\tclippedRect[2] = normalize( clippedRect[2] );\\n\\tclippedRect[3] = normalize( clippedRect[3] );\\n\\tclippedRect[4] = normalize( clippedRect[4] );\\n\\tfloat sum = 0.0;\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\\n\\tif (n >= 4)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\\n\\tif (n == 5)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\\n\\tsum = max( 0.0, sum );\\n\\tvec3 Lo_i = vec3( sum, sum, sum );\\n\\treturn Lo_i;\\n}\\nvec3 Rect_Area_Light_Specular_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\\n\\t\\tconst in float roughness,\\n\\t\\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tvec2 uv = ltcTextureCoords( geometry, roughness );\\n\\tvec4 brdfLtcApproxParams, t;\\n\\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\\n\\tt = texture2D( ltcMat, uv );\\n\\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\\n\\tmat3 brdfLtcApproxMat = mat3(\\n\\t\\tvec3( 1, 0, t.y ),\\n\\t\\tvec3( 0, t.z, 0 ),\\n\\t\\tvec3( t.w, 0, t.x )\\n\\t);\\n\\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\\n\\tspecularReflectance *= brdfLtcScalar;\\n\\treturn specularReflectance;\\n}\\nvec3 Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tmat3 diffuseBrdfMat = mat3(1);\\n\\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\\n\\treturn diffuseReflectance;\\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\";\n\n\tvar 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\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, 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#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\n\tvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\n\tvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar 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};\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\\n\\t}\\n#endif\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff;\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar 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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#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\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar 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 ) * flipNormal;\\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\";\n\n\tvar 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\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar 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\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\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}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\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\\t#include \\n}\\n\";\n\n\tvar 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 \\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\\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\";\n\n\tvar 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 \\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\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\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\\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\";\n\n\tvar 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 \\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\";\n\n\tvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\n\tvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\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\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\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#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\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_vertex: fog_vertex,\n\t\tfog_pars_vertex: fog_pars_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\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 ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tgradientmap: {\n\n\t\t\tgradientMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} },\n\n\t\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\t\trectAreaLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\twidth: {},\n\t\t\t\theight: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.gradientmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tscale: { value: 1 },\n\t\t\t\t\tdashSize: { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\t\t\t\tlightPos: { value: new Vector3() }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tShaderLib.standard.uniforms,\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyMatrix4( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( fog.isFog ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar materialId = 0;\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tvar x = attribute.getX( i );\n\t\t\t\tvar y = attribute.getY( i );\n\t\t\t\tvar z = attribute.getZ( i );\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\treturn this.expandByObject( object );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function expandByObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box;\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tif ( box === undefined ) box = new Box3(); // see #10547\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( light && light.isPointLight ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\t// TODO (abelnation / sam-g-steel): is this needed?\n\t\t\t\tif (shadow && shadow.isRectAreaLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material && material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tvar object3DId = 0;\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\n\t\tthis.onBeforeRender = function () {};\n\t\tthis.onAfterRender = function () {};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject3D.prototype = {\n\n\t\tconstructor: Object3D,\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.layers.mask = source.layers.mask;\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\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\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int8Array( array ), itemSize );\n\n\t}\n\n\tInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\n\tfunction Uint8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8Array( array ), itemSize );\n\n\t}\n\n\tUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\n\tfunction Uint8ClampedBufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\n\tfunction Int16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int16Array( array ), itemSize );\n\n\t}\n\n\tInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\n\tfunction Uint16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint16Array( array ), itemSize );\n\n\t}\n\n\tUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\n\tfunction Int32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int32Array( array ), itemSize );\n\n\t}\n\n\tInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\n\tfunction Uint32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint32Array( array ), itemSize );\n\n\t}\n\n\tUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\n\tfunction Float32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float32Array( array ), itemSize );\n\n\t}\n\n\tFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\n\tfunction Float64BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float64Array( array ), itemSize );\n\n\t}\n\n\tFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, {\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex = undefined;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t// http://stackoverflow.com/questions/1669190/javascript-min-max-array-values/13440842#13440842\n\n\tfunction arrayMax( array ) {\n\n\t\tvar length = array.length, max = - Infinity;\n\n\t\twhile ( length -- ) {\n\n\t\t\tif ( array[ length ] > max ) {\n\n\t\t\t\tmax = array[ length ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn max;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tvar count = 0;\n\tfunction GeometryIdCount() { return count++; }\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tGeometry.prototype = {\n\n\t\tconstructor: Geometry,\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( ( geometry && geometry.isGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( ( mesh && mesh.isMesh ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar i, il, j, jl, k, kl;\n\n\t\t\t// reset\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.colors = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [[]];\n\t\t\tthis.morphTargets = [];\n\t\t\tthis.morphNormals = [];\n\t\t\tthis.skinWeights = [];\n\t\t\tthis.skinIndices = [];\n\t\t\tthis.lineDistances = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// vertices\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// face vertex uvs\n\n\t\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargets = source.morphTargets;\n\n\t\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = {};\n\t\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t\t// vertices\n\n\t\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// normals\n\n\t\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t\t// morph normals\n\n\t\t\tvar morphNormals = source.morphNormals;\n\n\t\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphNormal = {};\n\n\t\t\t\t// vertex normals\n\n\t\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// face normals\n\n\t\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t\t}\n\n\t\t\t// skin weights\n\n\t\t\tvar skinWeights = source.skinWeights;\n\n\t\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// skin indices\n\n\t\t\tvar skinIndices = source.skinIndices;\n\n\t\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// line distances\n\n\t\t\tvar lineDistances = source.lineDistances;\n\n\t\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// update flags\n\n\t\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tBufferGeometry.prototype = {\n\n\t\tconstructor: BufferGeometry,\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tif ( Array.isArray( index ) ) {\n\n\t\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tthis.index = index;\n\n\t\t\t}\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh ) {\n\n\t\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar position = this.attributes.position;\n\n\t\t\t\tif ( position ) {\n\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( ( geometry && geometry.isBufferGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// index\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tvar morphAttributes = source.morphAttributes;\n\n\t\t\tfor ( name in morphAttributes ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// draw range\n\n\t\t\tthis.drawRange.start = source.drawRange.start;\n\t\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uv ) {\n\n\t\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar intersection;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = ( material && material.isMultiMaterial );\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar uvs;\n\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar numberOfVertices = 0;\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth = width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar ix, iy;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar ix, iy;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else if ( index.array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\t\t\t\tsize = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t \n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\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 );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshToonMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( map.isTexture ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tvar type = gl.FLOAT;\n\t\t\tvar array = data.array;\n\n\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\ttype = gl.FLOAT;\n\n\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\ttype = gl.SHORT;\n\n\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\ttype = gl.INT;\n\n\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\ttype = gl.BYTE;\n\n\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t\t}\n\n\t\t\tattributeProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\t\tattributeProperties.type = type;\n\t\t\tattributeProperties.version = data.version;\n\n\t\t\tdata.onUploadCallback();\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\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.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getAttributeProperties( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data );\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute );\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetAttributeProperties: getAttributeProperties,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\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 );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar version = parseFloat( /^WebGL\\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );\n\t\tvar lineWidthAvailable = parseFloat( version ) >= 1.0;\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\t\t\tdepthBuffer.setClear( 1 );\n\t\t\tstencilBuffer.setClear( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t\t// internal state cache\n\n\t\t\t_currentProgram = null,\n\t\t\t_currentRenderTarget = null,\n\t\t\t_currentFramebuffer = null,\n\t\t\t_currentMaterialId = - 1,\n\t\t\t_currentGeometryProgram = '',\n\t\t\t_currentCamera = null,\n\n\t\t\t_currentScissor = new Vector4(),\n\t\t\t_currentScissorTest = null,\n\n\t\t\t_currentViewport = new Vector4(),\n\n\t\t\t//\n\n\t\t\t_usedTextureUnits = 0,\n\n\t\t\t//\n\n\t\t\t_clearColor = new Color( 0x000000 ),\n\t\t\t_clearAlpha = 0,\n\n\t\t\t_width = _canvas.width,\n\t\t\t_height = _canvas.height,\n\n\t\t\t_pixelRatio = 1,\n\n\t\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissorTest = false,\n\n\t\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t\t// frustum\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t// clipping\n\n\t\t\t_clipping = new WebGLClipping(),\n\t\t\t_clippingEnabled = false,\n\t\t\t_localClippingEnabled = false,\n\n\t\t\t_sphere = new Sphere(),\n\n\t\t\t// camera matrices cache\n\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_vector3 = new Vector3(),\n\t\t\t_matrix4 = new Matrix4(),\n\t\t\t_matrix42 = new Matrix4(),\n\n\t\t\t// light arrays cache\n\n\t\t\t_lights = {\n\n\t\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\trectArea: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\t\tshadows: []\n\n\t\t\t},\n\n\t\t\t// info\n\n\t\t\t_infoRender = {\n\n\t\t\t\tcalls: 0,\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0,\n\t\t\t\tpoints: 0\n\n\t\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundPlaneCamera, backgroundPlaneMesh;\n\t\tvar backgroundBoxCamera, backgroundBoxMesh;\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\t\tmaterial.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\t\tvar attributeProperties = objects.getAttributeProperties( geometryAttribute );\n\n\t\t\t\t\t\tvar buffer = attributeProperties.__webglBuffer;\n\t\t\t\t\t\tvar type = attributeProperties.type;\n\t\t\t\t\t\tvar bytesPerElement = attributeProperties.bytesPerElement;\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tstate.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tif ( backgroundBoxCamera === undefined ) {\n\n\t\t\t\t\tbackgroundBoxCamera = new PerspectiveCamera();\n\n\t\t\t\t\tbackgroundBoxMesh = new Mesh(\n\t\t\t\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\t\tfog: false\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );\n\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tif ( backgroundPlaneCamera === undefined ) {\n\n\t\t\t\t\tbackgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\t\tbackgroundPlaneMesh = new Mesh(\n\t\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t\t! material.isRawShaderMaterial ||\n\t\t\t\tmaterial.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.rectAreaLights.value = _lights.rectArea;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isMeshNormalMaterial ||\n\t\t\t\t\tmaterial.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// RectAreaLight Texture\n\t\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\t\tif ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE;\n\t\t\t\tif ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE;\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t\tif ( material.gradientMap ) {\n\n\t\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\t\tr = 0, g = 0, b = 0,\n\t\t\t\tcolor,\n\t\t\t\tintensity,\n\t\t\t\tdistance,\n\t\t\t\tshadowMap,\n\n\t\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\trectAreaLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\t// (a) intensity controls irradiance of entire light\n\t\t\t\t\tuniforms.color\n\t\t\t\t\t\t.copy( color )\n\t\t\t\t\t\t.multiplyScalar( intensity / ( light.width * light.height ) );\n\n\t\t\t\t\t// (b) intensity controls the radiance per light area\n\t\t\t\t\t// uniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\t\t_matrix42.identity();\n\t\t\t\t\t_matrix4.copy( light.matrixWorld );\n\t\t\t\t\t_matrix4.premultiply( viewMatrix );\n\t\t\t\t\t_matrix42.extractRotation( _matrix4 );\n\n\t\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\t\tuniforms.halfWidth.applyMatrix4( _matrix42 );\n\t\t\t\t\tuniforms.halfHeight.applyMatrix4( _matrix42 );\n\n\t\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\t\t_lights.rectArea[ rectAreaLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.rectArea.length = rectAreaLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t// TODO (sam-g-steel) why aren't we using join\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar i, j, l, o, ol;\n\t\tvar edge = [ 0, 0 ], edges = {}, e;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\t\tvar vertex;\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tvar position, indices, groups;\n\t\t\tvar group, start, count;\n\t\t\tvar index1, index2;\n\n\t\t\tvertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\t\t\t\tindices = geometry.index;\n\t\t\t\tgroups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.count );\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\t\tstart = group.start;\n\t\t\t\t\tcount = group.count;\n\n\t\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices.getX( i + j );\n\t\t\t\t\t\t\tedge[ 1 ] = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( key in edges ) {\n\n\t\t\t\t\te = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\n\t\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tvar v = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tvar u = j / slices;\n\n\t\t\t\tvar p = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\tvar a = i * sliceCount + j;\n\t\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tvar azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\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\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\t r, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, j;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\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.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // curve to extrude shape along\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( ( font && font.isFont ) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar ix, iy;\n\n\t\tvar index = 0;\n\t\tvar grid = [];\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = iy / heightSegments;\n\n\t\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tvar u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// some helper variables\n\n\t\tvar segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t */\n\n\tfunction ShapeGeometry( shapes, curveSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tcurveSegments = curveSegments || 12;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar groupStart = 0;\n\t\tvar groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tvar i, l, shapeHole;\n\n\t\t\tvar indexOffset = vertices.length / 3;\n\t\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\t\tvar shapeVertices = points.shape;\n\t\t\tvar shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t\t// also check if holes are in the opposite direction\n\n\t\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\t\tvar edge = [ 0, 0 ], edges = {};\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t\t// prepare source geometry\n\n\t\tvar geometry2;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar sourceVertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tkey = edge.toString();\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\tvar e = edges[ key ];\n\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar index = 0;\n\t\tvar indexOffset = 0;\n\t\tvar indexArray = [];\n\t\tvar halfHeight = height / 2;\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\n\t\t\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, s;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tShapeBufferGeometry: ShapeBufferGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tBoxGeometry: BoxGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = Array.isArray( materials ) ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author takahirox / http://github.com/takahirox\n\t *\n\t * parameters = {\n\t * gradientMap: new THREE.Texture( )\n\t * }\n\t */\n\n\tfunction MeshToonMaterial( parameters ) {\n\n\t\tMeshPhongMaterial.call( this );\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.gradientMap = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\n\tMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\n\tMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\n\tMeshToonMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshToonMaterial: MeshToonMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FileLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FileLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { type: mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMimeType: function ( value ) {\n\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tfunction DataTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( DataTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\t\timage.addEventListener( 'load', function () {\n\n\t\t\t\tCache.add( url, this );\n\n\t\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\t/*\n\t\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t\t}, false );\n\t\t\t*/\n\n\t\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\timage.src = url;\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function ( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function () {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function () {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function ( timeOffset ) {\n\n\t\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function ( timeScale ) {\n\n\t\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function ( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== - 1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function () {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif ( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function () {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0; m !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar BlendingMode = {\n\t\t\t\tNoBlending: NoBlending,\n\t\t\t\tNormalBlending: NormalBlending,\n\t\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\t\tCustomBlending: CustomBlending\n\t\t\t};\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\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.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = null;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tscope.parse( json, onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tvar TextureMapping = {\n\t\t\t\tUVMapping: UVMapping,\n\t\t\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\t\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\t\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\t\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\t\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\t\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\t\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t\t\t};\n\n\t\t\tvar TextureWrapping = {\n\t\t\t\tRepeatWrapping: RepeatWrapping,\n\t\t\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\t\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t\t\t};\n\n\t\t\tvar TextureFilter = {\n\t\t\t\tNearestFilter: NearestFilter,\n\t\t\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\t\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\t\t\tLinearFilter: LinearFilter,\n\t\t\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\t\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t\t\t};\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.' );\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Bezier Curves formulas obtained from\n\t * http://en.wikipedia.org/wiki/Bézier_curve\n\t */\n\n\tfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\tvar t2 = t * t;\n\t\tvar t3 = t * t2;\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t}\n\n\t//\n\n\tfunction QuadraticBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * p;\n\n\t}\n\n\tfunction QuadraticBezierP1( t, p ) {\n\n\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t}\n\n\tfunction QuadraticBezierP2( t, p ) {\n\n\t\treturn t * t * p;\n\n\t}\n\n\tfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\t\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\t\tQuadraticBezierP2( t, p2 );\n\n\t}\n\n\t//\n\n\tfunction CubicBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * k * p;\n\n\t}\n\n\tfunction CubicBezierP1( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn 3 * k * k * t * p;\n\n\t}\n\n\tfunction CubicBezierP2( t, p ) {\n\n\t\treturn 3 * ( 1 - t ) * t * t * p;\n\n\t}\n\n\tfunction CubicBezierP3( t, p ) {\n\n\t\treturn t * t * t * p;\n\n\t}\n\n\tfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\t\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\t\tCubicBezierP3( t, p3 );\n\n\t}\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.CatmullRomCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\n\n\t\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function ( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\treturn new Vector2(\n\t\t\tCatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),\n\t\t\tCatmullRom( weight, point0.y, point1.y, point2.y, point3.y )\n\t\t);\n\n\t};\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector2(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector2(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\t **/\n\n\tfunction ShapePath() {\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tShapePath.prototype = {\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push( this.currentPath );\n\t\t\tthis.currentPath.moveTo( x, y );\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tthis.currentPath.lineTo( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts ) {\n\n\t\t\tthis.currentPath.splineThru( pts );\n\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\t\toffsetX = 0;\n\t\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [];\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tvar AudioContext = {\n\n\t\tgetContext: function () {\n\n\t\t\tif ( context === undefined ) {\n\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t\t}\n\n\t\t\treturn context;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = AudioContext.getContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction RectAreaLight ( color, intensity, width, height ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.position.set( 0, 1, 0 );\n\t\tthis.updateMatrix();\n\n\t\tthis.width = ( width !== undefined ) ? width : 10;\n\t\tthis.height = ( height !== undefined ) ? height : 10;\n\n\t\t// TODO (abelnation): distance/decay\n\n\t\t// TODO (abelnation): update method for RectAreaLight to update transform to lookat target\n\n\t\t// TODO (abelnation): shadows\n\t\t// this.shadow = new THREE.RectAreaLightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\t// TODO (abelnation): RectAreaLight update when light shape is changed\n\tRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: RectAreaLight,\n\n\t\tisRectAreaLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\t// this.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.loop = false;\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.buffer;\n\t\t\tsource.loop = this.loop;\n\t\t\tsource.onended = this.onEnded.bind( this );\n\t\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\t\tsource.start( 0, this.startTime );\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.loop = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.loop = this.loop;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tbufferType = Array;\n\t\t\t\tmixFunction = this._select;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:[\\w-]+[\\/:])*)([\\w-]+)?(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?\\.([\\w-]+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ],\n\t\t\t\t\tknownObject = undefined;\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis._loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tAnimationMixer.prototype = {\n\n\t\tconstructor: AnimationMixer,\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function () {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function ( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function () {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function ( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function ( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function ( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function ( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function ( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function () {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function ( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function ( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function () {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tUniform.prototype.clone = function () {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n\t *\n\t */\n\n\tfunction Cylindrical( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tCylindrical.prototype = {\n\n\t\tconstructor: Cylindrical,\n\n\t\tset: function ( radius, theta, y ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.theta = theta;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.theta = other.theta;\n\t\t\tthis.y = other.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\t\tthis.y = vec3.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = 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} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar color1 = new Color( 0, 0, 1 );\n\t\tvar color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( object && object.isBone ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar boneMatrix = new Matrix4();\n\t\tvar matrixWorldInv = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\t\tfor ( var i = 0, j = 0; i < this.bones.length; i ++ ) {\n\n\t\t\t\tvar bone = this.bones[ i ];\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tj += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t * @author Mugen87 / http://github.com/Mugen87\n\t */\n\n\tfunction RectAreaLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar materialFront = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false\n\t\t} );\n\n\t\tvar materialBack = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false,\n\t\t\twireframe: true\n\t\t} );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 6 * 3 ), 3 ) );\n\n\t\t// shows the \"front\" of the light, e.g. where light comes from\n\n\t\tthis.add( new Mesh( geometry, materialFront ) );\n\n\t\t// shows the \"back\" of the light, which does not emit light\n\n\t\tthis.add( new Mesh( geometry, materialBack ) );\n\n\t\tthis.update();\n\n\t}\n\n\tRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\n\tRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\n\tRectAreaLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\t\tthis.children[ 1 ].geometry.dispose();\n\t\tthis.children[ 1 ].material.dispose();\n\n\t};\n\n\tRectAreaLightHelper.prototype.update = function () {\n\n\t\tvar vector1 = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh1 = this.children[ 0 ];\n\t\t\tvar mesh2 = this.children[ 1 ];\n\n\t\t\tif ( this.light.target ) {\n\n\t\t\t\tvector1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\t\tvar lookVec = vector2.clone().sub( vector1 );\n\t\t\t\tmesh1.lookAt( lookVec );\n\t\t\t\tmesh2.lookAt( lookVec );\n\n\t\t\t}\n\n\t\t\t// update materials\n\n\t\t\tmesh1.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tmesh2.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// calculate new dimensions of the helper\n\n\t\t\tvar hx = this.light.width * 0.5;\n\t\t\tvar hy = this.light.height * 0.5;\n\n\t\t\t// because the buffer attribute is shared over both geometries, we only have to update once\n\n\t\t\tvar position = mesh1.geometry.getAttribute( 'position' );\n\t\t\tvar array = position.array;\n\n\t\t\t// first face\n\n\t\t\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\t\t\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\t\t\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\n\t\t\t// second face\n\n\t\t\tarray[ 9 ] = - hx; array[ 10 ] = hy; array[ 11 ] = 0;\n\t\t\tarray[ 12 ] = - hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\t\t\tarray[ 15 ] = hx; array[ 16 ] = - hy; array[ 17 ] = 0;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction HemisphereLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } );\n\n\t\tvar position = geometry.getAttribute( 'position' );\n\t\tvar colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar color1 = new Color();\n\t\tvar color2 = new Color();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh = this.children[ 0 ];\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tcolor2.copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tsize = size || 10;\n\t\tdivisions = divisions || 10;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = size / divisions;\n\t\tvar halfSize = size / 2;\n\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author Hectate / http://www.github.com/Hectate\n\t */\n\n\tfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\t\tradius = radius || 10;\n\t\tradials = radials || 16;\n\t\tcircles = circles || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar x, z;\n\t\tvar v, i, j, r, color;\n\n\t\t// create the radials\n\n\t\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * radius;\n\t\t\tz = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tr = radius - ( radius / circles * i );\n\n\t\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tPolarGridHelper.prototype = Object.create( LineSegments.prototype );\n\tPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new BufferGeometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar colorFrustum = new Color( 0xffaa00 );\n\t\tvar colorCone = new Color( 0xff0000 );\n\t\tvar colorUp = new Color( 0x00aaff );\n\t\tvar colorTarget = new Color( 0xffffff );\n\t\tvar colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", colorFrustum );\n\t\taddLine( \"n2\", \"n4\", colorFrustum );\n\t\taddLine( \"n4\", \"n3\", colorFrustum );\n\t\taddLine( \"n3\", \"n1\", colorFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", colorFrustum );\n\t\taddLine( \"f2\", \"f4\", colorFrustum );\n\t\taddLine( \"f4\", \"f3\", colorFrustum );\n\t\taddLine( \"f3\", \"f1\", colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", colorFrustum );\n\t\taddLine( \"n2\", \"f2\", colorFrustum );\n\t\taddLine( \"n3\", \"f3\", colorFrustum );\n\t\taddLine( \"n4\", \"f4\", colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", colorCone );\n\t\taddLine( \"p\", \"n2\", colorCone );\n\t\taddLine( \"p\", \"n3\", colorCone );\n\t\taddLine( \"p\", \"n4\", colorCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", colorUp );\n\t\taddLine( \"u2\", \"u3\", colorUp );\n\t\taddLine( \"u3\", \"u1\", colorUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", colorTarget );\n\t\taddLine( \"p\", \"c\", colorCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", colorCross );\n\t\taddLine( \"cn3\", \"cn4\", colorCross );\n\n\t\taddLine( \"cf1\", \"cf2\", colorCross );\n\t\taddLine( \"cf3\", \"cf4\", colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\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 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( object && object.isBox3 ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry;\n\tvar coneGeometry;\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( lineGeometry === undefined ) {\n\n\t\t\tlineGeometry = new BufferGeometry();\n\t\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t];\n\n\t\tvar colors = [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\n\t/*\n\tBased on an optimized c++ solution in\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t - http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tfunction CubicPoly() {\n\n\t\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tfunction init( x0, x1, t0, t1 ) {\n\n\t\t\tc0 = x0;\n\t\t\tc1 = t0;\n\t\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t\t},\n\n\t\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\t\tt1 *= dt1;\n\t\t\t\tt2 *= dt1;\n\n\t\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t\t},\n\n\t\t\tcalc: function ( t ) {\n\n\t\t\t\tvar t2 = t * t;\n\t\t\t\tvar t3 = t2 * t;\n\t\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar tmp = new Vector3();\n\tvar px = new CubicPoly();\n\tvar py = new CubicPoly();\n\tvar pz = new CubicPoly();\n\n\tfunction CatmullRomCurve3( p /* array of Vector3 */ ) {\n\n\t\tthis.points = p || [];\n\t\tthis.closed = false;\n\n\t}\n\n\tCatmullRomCurve3.prototype = Object.create( Curve.prototype );\n\tCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\n\tCatmullRomCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar l = points.length;\n\n\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\tvar point = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tp1 = points[ intPoint % l ];\n\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t}\n\n\t\treturn new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );\n\n\t};\n\n\tfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve3.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\n\tCubicBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector3(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\n\tQuadraticBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector3(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t};\n\n\tfunction LineCurve3( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve3.prototype = Object.create( Curve.prototype );\n\tLineCurve3.prototype.constructor = LineCurve3;\n\n\tLineCurve3.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar vector = new Vector3();\n\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\tvector.multiplyScalar( t );\n\t\tvector.add( this.v1 );\n\n\t\treturn vector;\n\n\t};\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction MeshFaceMaterial( materials ) {\n\n\t\tconsole.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' );\n\t\treturn new MultiMaterial( materials );\n\n\t}\n\n\tfunction PointCloud( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction Particle( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\treturn new Sprite( material );\n\n\t}\n\n\tfunction ParticleSystem( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction PointCloudMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleBasicMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleSystemMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction Vertex( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\n\t}\n\n\t//\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\treturn new Int8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\treturn new Uint8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\treturn new Int16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\treturn new Uint16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\treturn new Int32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\treturn new Uint32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\treturn new Float64BufferAttribute( array, itemSize );\n\n\t}\n\n\t//\n\n\tCurve.create = function ( construct, getPoint ) {\n\n\t\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\t\tconstruct.prototype = Object.create( Curve.prototype );\n\t\tconstruct.prototype.constructor = construct;\n\t\tconstruct.prototype.getPoint = getPoint;\n\n\t\treturn construct;\n\n\t};\n\n\t//\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction SplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction Spline( points ) {\n\n\t\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\tObject.assign( Spline.prototype, {\n\n\t\tinitFromArray: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t\t},\n\t\tgetControlPointsArray: function ( optionalTarget ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t\t},\n\t\treparametrizeByArcLength: function ( samplingCoef ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\t//\n\tfunction BoundingBoxHelper( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\treturn new BoxHelper( object, color );\n\n\t}\n\n\tfunction EdgesHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\tfunction WireframeHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\t//\n\n\tfunction XHRLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\treturn new FileLoader( manager );\n\n\t}\n\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\treturn new DataTextureLoader( manager );\n\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tLine3.prototype.center = function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t};\n\n\t_Math.random16 = function () {\n\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t};\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\textractPosition: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\n\t\t},\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\trotateAxis: function ( v ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\ttranslate: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t\t},\n\t\trotateX: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t\t},\n\t\trotateY: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t\t},\n\t\trotateZ: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t\t},\n\t\trotateByAxis: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t\t},\n\t\tmakeFrustum: function( left, right, bottom, top, near, far ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t\t}\n\n\t} );\n\n\tPlane.prototype.isIntersectionLine = function ( line ) {\n\n\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\treturn this.intersectsLine( line );\n\n\t};\n\n\tQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t};\n\n\tObject.assign( Ray.prototype, {\n\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\n\t\textrude: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tsetEulerFromRotationMatrix: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t\t},\n\t\tapplyProjection: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\t\treturn this.applyMatrix4( m );\n\n\t\t},\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tGeometry.prototype.computeTangents = function () {\n\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t};\n\n\tObject.assign( Object3D.prototype, {\n\n\t\tgetChildByName: function ( name ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\n\t\t},\n\t\trenderDepth: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\n\t\teulerOrder: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\n\t\tobjects: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\n\t\tlength: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\t\treturn this.array.length;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\n\t\taddIndex: function ( index ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\t\tif ( indexOffset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\n\t\t},\n\t\tclearDrawCalls: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\n\t\t},\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t\t},\n\t\tcomputeOffsets: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\n\t\tdynamic: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\n\t\twrapAround: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\t\tmetal: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\n\t\tderivatives: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\n\t\tsupportsFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\t\treturn this.capabilities.vertexTextures;\n\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\n\t\t},\n\t\tinitMaterial: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t\t},\n\t\taddPrePlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t\t},\n\t\taddPostPlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t\t},\n\t\tupdateShadowMap: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.enabled;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.cullFace;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\n\t\tcullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\t\twrapS: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tAudio.prototype.load = function ( file ) {\n\n\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\tvar scope = this;\n\t\tvar audioLoader = new AudioLoader();\n\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\tscope.setBuffer( buffer );\n\n\t\t} );\n\t\treturn this;\n\n\t};\n\n\tAudioAnalyser.prototype.getData = function () {\n\n\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\treturn this.getFrequencyData();\n\n\t};\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector() {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function () {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer() {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.Texture = Texture;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.FileLoader = FileLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.RectAreaLight = RectAreaLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.AudioContext = AudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Cylindrical = Cylindrical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.RectAreaLightHelper = RectAreaLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.PolarGridHelper = PolarGridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.Path = Path;\n\texports.ShapePath = ShapePath;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ShapeBufferGeometry = ShapeBufferGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshToonMaterial = MeshToonMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.Float64BufferAttribute = Float64BufferAttribute;\n\texports.Float32BufferAttribute = Float32BufferAttribute;\n\texports.Uint32BufferAttribute = Uint32BufferAttribute;\n\texports.Int32BufferAttribute = Int32BufferAttribute;\n\texports.Uint16BufferAttribute = Uint16BufferAttribute;\n\texports.Int16BufferAttribute = Int16BufferAttribute;\n\texports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\n\texports.Uint8BufferAttribute = Uint8BufferAttribute;\n\texports.Int8BufferAttribute = Int8BufferAttribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MeshFaceMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Particle;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.Spline = Spline;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.XHRLoader = XHRLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 6\n// module chunks = 0","const THREE = require('three');\r\nconst EffectComposer = require('three-effectcomposer')(THREE)\r\n\r\nimport {PROXY_BUFFER_SIZE} from './proxy_geometry'\r\n\r\nexport default function RayMarcher(renderer, scene, camera) {\r\n var composer = new EffectComposer(renderer);\r\n var shaderPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n u_buffer: {\r\n type: '4fv',\r\n value: undefined\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/rayMarch-frag.glsl')\r\n });\r\n shaderPass.renderToScreen = true;\r\n composer.addPass(shaderPass);\r\n\r\n var inverseProjectionMatrix = new THREE.Matrix4();\r\n\r\n return {\r\n render: function(buffer, camera, options) {\r\n\r\n shaderPass.material.uniforms.u_buffer.value = buffer;\r\n shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE;\r\n shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n\r\n camera.updateMatrix();\r\n camera.updateProjectionMatrix();\r\n\r\n inverseProjectionMatrix.getInverse(camera.projectionMatrix);\r\n shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n composer.render();\r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/rayMarching.js","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n var CopyShader = EffectComposer.CopyShader = require('three-copyshader')\n , RenderPass = EffectComposer.RenderPass = require('./lib/renderpass')(THREE)\n , ShaderPass = EffectComposer.ShaderPass = require('./lib/shaderpass')(THREE, EffectComposer)\n , MaskPass = EffectComposer.MaskPass = require('./lib/maskpass')(THREE)\n , ClearMaskPass = EffectComposer.ClearMaskPass = require('./lib/clearmaskpass')(THREE)\n\n function EffectComposer( renderer, renderTarget ) {\n this.renderer = renderer;\n\n if ( renderTarget === undefined ) {\n var width = window.innerWidth || 1;\n var height = window.innerHeight || 1;\n var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\n renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n this.passes = [];\n\n this.copyPass = new ShaderPass( CopyShader );\n };\n\n EffectComposer.prototype = {\n swapBuffers: function() {\n\n var tmp = this.readBuffer;\n this.readBuffer = this.writeBuffer;\n this.writeBuffer = tmp;\n\n },\n\n addPass: function ( pass ) {\n\n this.passes.push( pass );\n\n },\n\n insertPass: function ( pass, index ) {\n\n this.passes.splice( index, 0, pass );\n\n },\n\n render: function ( delta ) {\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n var maskActive = false;\n\n var pass, i, il = this.passes.length;\n\n for ( i = 0; i < il; i ++ ) {\n\n pass = this.passes[ i ];\n\n if ( !pass.enabled ) continue;\n\n pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n if ( pass.needsSwap ) {\n\n if ( maskActive ) {\n\n var context = this.renderer.context;\n\n context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n }\n\n this.swapBuffers();\n\n }\n\n if ( pass instanceof MaskPass ) {\n\n maskActive = true;\n\n } else if ( pass instanceof ClearMaskPass ) {\n\n maskActive = false;\n\n }\n\n }\n\n },\n\n reset: function ( renderTarget ) {\n\n if ( renderTarget === undefined ) {\n\n renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = window.innerWidth;\n renderTarget.height = window.innerHeight;\n\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n },\n\n setSize: function ( width, height ) {\n\n var renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = width;\n renderTarget.height = height;\n\n this.reset( renderTarget );\n\n }\n\n };\n\n // shared ortho camera\n\n EffectComposer.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n EffectComposer.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\n EffectComposer.scene = new THREE.Scene();\n EffectComposer.scene.add( EffectComposer.quad );\n\n return EffectComposer\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/index.js\n// module id = 8\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nmodule.exports = {\n uniforms: {\n \"tDiffuse\": { type: \"t\", value: null },\n \"opacity\": { type: \"f\", value: 1.0 }\n },\n vertexShader: [\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vUv = uv;\",\n \"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n \"}\"\n ].join(\"\\n\"),\n fragmentShader: [\n \"uniform float opacity;\",\n\n \"uniform sampler2D tDiffuse;\",\n\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vec4 texel = texture2D( tDiffuse, vUv );\",\n \"gl_FragColor = opacity * texel;\",\n\n \"}\"\n ].join(\"\\n\")\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-copyshader/index.js\n// module id = 9\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function RenderPass( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n if (!(this instanceof RenderPass)) return new RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha);\n\n this.scene = scene;\n this.camera = camera;\n\n this.overrideMaterial = overrideMaterial;\n\n this.clearColor = clearColor;\n this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n this.oldClearColor = new THREE.Color();\n this.oldClearAlpha = 1;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n };\n\n RenderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n this.scene.overrideMaterial = this.overrideMaterial;\n\n if ( this.clearColor ) {\n\n this.oldClearColor.copy( renderer.getClearColor() );\n this.oldClearAlpha = renderer.getClearAlpha();\n\n renderer.setClearColor( this.clearColor, this.clearAlpha );\n\n }\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n if ( this.clearColor ) {\n\n renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n }\n\n this.scene.overrideMaterial = null;\n\n }\n\n };\n\n return RenderPass;\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/renderpass.js\n// module id = 10\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE, EffectComposer) {\n function ShaderPass( shader, textureID ) {\n if (!(this instanceof ShaderPass)) return new ShaderPass(shader, textureID);\n\n this.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n this.material = new THREE.ShaderMaterial( {\n\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader\n\n } );\n\n this.renderToScreen = false;\n\n this.enabled = true;\n this.needsSwap = true;\n this.clear = false;\n\n };\n\n ShaderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n if ( this.uniforms[ this.textureID ] ) {\n\n this.uniforms[ this.textureID ].value = readBuffer;\n\n }\n\n EffectComposer.quad.material = this.material;\n\n if ( this.renderToScreen ) {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera );\n\n } else {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera, writeBuffer, this.clear );\n\n }\n\n }\n\n };\n\n return ShaderPass;\n\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/shaderpass.js\n// module id = 11\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function MaskPass( scene, camera ) {\n if (!(this instanceof MaskPass)) return new MaskPass(scene, camera);\n\n this.scene = scene;\n this.camera = camera;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n this.inverse = false;\n };\n\n MaskPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n var context = renderer.context;\n\n // don't update color or depth\n\n context.colorMask( false, false, false, false );\n context.depthMask( false );\n\n // set up stencil\n\n var writeValue, clearValue;\n\n if ( this.inverse ) {\n\n writeValue = 0;\n clearValue = 1;\n\n } else {\n\n writeValue = 1;\n clearValue = 0;\n\n }\n\n context.enable( context.STENCIL_TEST );\n context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n context.clearStencil( clearValue );\n\n // draw into the stencil buffer\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n renderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n // re-enable update of color and depth\n\n context.colorMask( true, true, true, true );\n context.depthMask( true );\n\n // only render where stencil is set to 1\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n context.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n }\n\n };\n\n return MaskPass\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/maskpass.js\n// module id = 12\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function ClearMaskPass() {\n if (!(this instanceof ClearMaskPass)) return new ClearMaskPass(scene, camera);\n this.enabled = true;\n };\n\n ClearMaskPass.prototype = {\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n var context = renderer.context;\n context.disable( context.STENCIL_TEST );\n }\n };\n\n return ClearMaskPass\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/clearmaskpass.js\n// module id = 13\n// module chunks = 0","module.exports = \"varying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvoid main() {\\r\\n\\tvec2 tmp = vec2(uv.x, uv.y);\\r\\n tmp = (tmp * 2.0) - vec2(1.0);\\r\\n f_ndcP = vec4(tmp, 1.0, 1.0) * 1000.0;\\r\\n f_uv = uv;\\r\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/pass-vert.glsl\n// module id = 14\n// module chunks = 0","module.exports = \"#define MAX_GEOMETRY_COUNT 100\\r\\n#define FAR_CLIP 1000.0\\r\\n#define SHADOW_ITERATIONS 64\\r\\n#define MAX_ITERATIONS 100\\r\\n#define EPSILON 0.005\\r\\n\\r\\n/* This is how I'm packing the data\\r\\nstruct geometry_t {\\r\\n vec3 position;\\r\\n float type;\\r\\n};\\r\\n*/\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\\r\\nuniform int u_count;\\r\\n\\r\\nuniform float u_debug;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\nfloat sdSphere( vec3 p, float s )\\r\\n{\\r\\n\\treturn length(p) - s;\\r\\n}\\r\\n\\r\\nfloat udBox( vec3 p, vec3 b )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0));\\r\\n}\\r\\n\\r\\nfloat sdPlane( vec3 p, vec4 n )\\r\\n{\\r\\n // n must be normalized\\r\\n return dot(p,n.xyz) + n.w;\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p, in vec3 c )\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2( c.z*c.y/c.x, -c.z );\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0)*qv/vv;\\r\\n return sqrt( dot(w,w) - max(d.x,d.y) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nRay getRay()\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = u_cameraPosition;\\r\\n\\tray.direction = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - ray.position);\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat evaluateGeometrySDF(vec3 point, vec4 geo)\\r\\n{\\r\\n\\tvec3 localPoint = point - geo.xyz;\\r\\n\\r\\n if(geo.w == 0.0)\\r\\n \\treturn udBox(localPoint, vec3(.5));\\r\\n\\telse if(geo.w == 1.0)\\r\\n\\t\\treturn sdSphere(localPoint, 1.0);\\r\\n\\telse if(geo.w == 2.0)\\r\\n\\t\\treturn sdCappedCone(localPoint * .5, normalize(vec3(1.0)));\\r\\n\\telse if(geo.w == 3.0)\\r\\n\\t\\treturn sdPlane(localPoint, vec4(0.0, 1.0, 0.0, 0.0));\\r\\n\\r\\n\\treturn FAR_CLIP;\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\r\\n \\tfor (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n float d = evaluateGeometrySDF(point, geo);\\r\\n\\r\\n \\tif(d < minDistance)\\r\\n \\t\\tminDistance = d;\\r\\n }\\r\\n\\r\\n return minDistance;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\\r\\n{\\t\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n\\t\\tfloat d = evaluateGeometrySDF(point, geo);\\r\\n \\r\\n \\tif(d < minDistance)\\r\\n \\t\\tminDistance = d;\\r\\n }\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n\\r\\nfloat evaluateShadows(vec3 point, vec3 light)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = point;\\r\\n\\tray.direction = (light - point);\\r\\n\\r\\n\\tfloat maxDistance = length(ray.direction);\\r\\n\\tray.direction = normalize(ray.direction);\\r\\n\\r\\n float t = 0.0;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = evaluateSceneSDFSimple(current);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\r\\n\\t\\tif(t > maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\treturn 1.0 - smoothstep(t, t + .5, maxDistance);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\tRay ray = getRay();\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n float t = 0.0;\\r\\n float iterationCount = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tfloat d = FAR_CLIP;\\r\\n\\t\\tevaluateSceneSDF(current, d);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t{\\r\\n\\t\\t\\tvec3 normal = estimateSceneGradient(current, EPSILON);\\r\\n\\r\\n\\t\\t\\tvec3 light = vec3(0.0, 4.0, 3.0);\\r\\n\\t\\t\\tvec3 l = light - current;\\r\\n\\r\\n\\t\\t\\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\t\\t\\tfloat diffuse = clamp(dot(normal, normalize(l)) * falloff, 0.0, 1.0);\\r\\n\\t\\t\\tfloat shadow = evaluateShadows(current + normal * .05, light);\\r\\n\\r\\n\\t\\t\\tcolor = vec3(diffuse * shadow);\\r\\n\\t\\t\\tbreak;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/rayMarch-frag.glsl\n// module id = 15\n// module chunks = 0","module.exports = __webpack_public_path__ + \"index.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/file-loader?name=[name].[ext]!./index.html\n// module id = 16\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\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\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 17\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/build/index.html b/build/index.html new file mode 100644 index 0000000..04f465e --- /dev/null +++ b/build/index.html @@ -0,0 +1,19 @@ + + + + Project 6: Implicit Surfaces + + + + + + \ No newline at end of file From 965e4f71877f67893b805300c07e1bd7494ed2d7 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Tue, 28 Feb 2017 03:20:08 -0500 Subject: [PATCH 04/26] + Soft shadows with some nice distance fallof + Tweaked main algorithm, added a smaller secondary iteration pass * Fixed some NaN issues --- src/glsl/pass-vert.glsl | 14 +++- src/glsl/rayMarch-frag.glsl | 157 ++++++++++++++++++++++-------------- src/main.js | 3 + 3 files changed, 112 insertions(+), 62 deletions(-) diff --git a/src/glsl/pass-vert.glsl b/src/glsl/pass-vert.glsl index 256bc64..bcd7bd5 100644 --- a/src/glsl/pass-vert.glsl +++ b/src/glsl/pass-vert.glsl @@ -1,10 +1,22 @@ +#define FAR_CLIP 1000.0 + varying vec2 f_uv; varying vec4 f_ndcP; +varying vec3 f_rayDir; +varying vec3 f_rayPos; + +uniform mat4 u_viewProjectionMatrix; +uniform vec3 u_cameraPosition; + void main() { vec2 tmp = vec2(uv.x, uv.y); tmp = (tmp * 2.0) - vec2(1.0); - f_ndcP = vec4(tmp, 1.0, 1.0) * 1000.0; + f_ndcP = vec4(tmp, 1.0, 1.0) * FAR_CLIP; f_uv = uv; + + f_rayDir = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - u_cameraPosition); + f_rayPos = u_cameraPosition; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } \ No newline at end of file diff --git a/src/glsl/rayMarch-frag.glsl b/src/glsl/rayMarch-frag.glsl index 5c49653..8672cd9 100644 --- a/src/glsl/rayMarch-frag.glsl +++ b/src/glsl/rayMarch-frag.glsl @@ -1,15 +1,16 @@ -#define MAX_GEOMETRY_COUNT 100 +#define MAX_GEOMETRY_COUNT 50 #define FAR_CLIP 1000.0 -#define SHADOW_ITERATIONS 64 -#define MAX_ITERATIONS 100 +#define MAX_ITERATIONS 64 +#define SECONDARY_ITERATIONS 3 #define EPSILON 0.005 -/* This is how I'm packing the data -struct geometry_t { - vec3 position; - float type; -}; -*/ +#define NORMAL_ESTIMATION_EPSILON .005 + +// SHADOW PARAMETERS +#define SHADOW_ITERATIONS 24 +#define SHADOW_SOFT_FACTOR 8.0 +#define SHADOW_EPSILON 0.00 +#define SHADOW_OFFSET .005 struct Ray { vec3 position; @@ -27,6 +28,9 @@ uniform float u_debug; varying vec2 f_uv; varying vec4 f_ndcP; +varying vec3 f_rayPos; +varying vec3 f_rayDir; + // Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm vec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d) { @@ -44,20 +48,19 @@ vec3 debugIterations(float factor) } // All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm -float sdSphere( vec3 p, float s ) +float sdSphere( vec3 p ) { - return length(p) - s; + return length(p) - 1.0; } -float udBox( vec3 p, vec3 b ) +float udBox( vec3 p) { - return length(max(abs(p) - b, 0.0)); + return length(max(abs(p) - vec3(.5), 0.0)); } -float sdPlane( vec3 p, vec4 n ) +float sdPlane( vec3 p) { - // n must be normalized - return dot(p,n.xyz) + n.w; + return p.y; } float udRoundBox( vec3 p, vec3 b, float r ) @@ -69,19 +72,19 @@ float sdCappedCone( in vec3 p, in vec3 c ) { p.y -= .25; vec2 q = vec2( length(p.xz), p.y ); - vec2 v = vec2( c.z*c.y/c.x, -c.z ); + vec2 v = vec2( c.z*c.y / c.x, -c.z ); vec2 w = v - q; vec2 vv = vec2( dot(v,v), v.x*v.x ); vec2 qv = vec2( dot(v,w), v.x*w.x ); - vec2 d = max(qv,0.0)*qv/vv; - return sqrt( dot(w,w) - max(d.x,d.y) ) * sign(max(q.y*v.x-q.x*v.y,w.y)); + vec2 d = max(qv,0.0) * qv / vv; + return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y)); } -Ray getRay() +Ray getRay(vec3 origin, vec3 dir) { Ray ray; - ray.position = u_cameraPosition; - ray.direction = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - ray.position); + ray.position = origin; + ray.direction = dir; return ray; } @@ -90,13 +93,13 @@ float evaluateGeometrySDF(vec3 point, vec4 geo) vec3 localPoint = point - geo.xyz; if(geo.w == 0.0) - return udBox(localPoint, vec3(.5)); + return udBox(localPoint); else if(geo.w == 1.0) - return sdSphere(localPoint, 1.0); + return sdSphere(localPoint); else if(geo.w == 2.0) return sdCappedCone(localPoint * .5, normalize(vec3(1.0))); else if(geo.w == 3.0) - return sdPlane(localPoint, vec4(0.0, 1.0, 0.0, 0.0)); + return sdPlane(localPoint); return FAR_CLIP; } @@ -106,16 +109,14 @@ float evaluateSceneSDFSimple(vec3 point) { float minDistance = FAR_CLIP; - for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) + for (int i = 0; i < MAX_GEOMETRY_COUNT; i++) { if (i >= u_count) break; vec4 geo = u_buffer[i]; float d = evaluateGeometrySDF(point, geo); - - if(d < minDistance) - minDistance = d; + minDistance = min(d, minDistance); } return minDistance; @@ -134,8 +135,7 @@ void evaluateSceneSDF(vec3 point, out float minDistance) vec4 geo = u_buffer[i]; float d = evaluateGeometrySDF(point, geo); - if(d < minDistance) - minDistance = d; + minDistance = min(d, minDistance); } } @@ -154,63 +154,77 @@ vec3 estimateSceneGradient(vec3 point, float epsilon) } -float evaluateShadows(vec3 point, vec3 light) -{ - Ray ray; - ray.position = point; - ray.direction = (light - point); +// vec3 reduceDiscontinuity(vec3 p, vec3 o, float d, ) - float maxDistance = length(ray.direction); - ray.direction = normalize(ray.direction); +// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm +// with tweaks +float evaluateShadows(vec3 origin, vec3 toLight) +{ + vec3 direction = toLight; + float maxDistance = length(direction); + direction /= maxDistance; - float t = 0.0; - vec3 current = ray.position; + float t = SHADOW_EPSILON; + float soft = .5; + // WebGL doesnt like loops that cannot be easily unrolled for(int i = 0; i < SHADOW_ITERATIONS; i++) { - float d = evaluateSceneSDFSimple(current); + float d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance); - if(d < EPSILON) + if(d < SHADOW_EPSILON) break; - t += d; - current += ray.direction * d; + soft = min(soft, SHADOW_SOFT_FACTOR * (d / t)); - if(t > maxDistance) + if(t >= maxDistance) break; + + t += d; } - return 1.0 - smoothstep(t, t + .5, maxDistance); + soft = clamp(soft * 2.0, 0.0, 1.0); + + // This is a mix of soft shadows and a fake AO + return soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft); +} + + +vec3 shade(vec3 point, Ray ray, float t) +{ + vec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON ); + + vec3 light = vec3(0.0, 4.0, 3.0); + vec3 l = light - point; + + float falloff = 15.0 / pow(length(l) + EPSILON, 2.0); + float diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0); + float shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l); + + return vec3(diffuse * falloff * shadow); } void main() { - Ray ray = getRay(); + // Renormalize due to interpolation + Ray ray = getRay(f_rayPos, normalize(f_rayDir)); + + vec4 tmp = u_viewProjectionMatrix * f_ndcP; + ray.direction = normalize(vec3(tmp.xyz * tmp.w) - u_cameraPosition); vec3 color; vec3 current = ray.position; + float t = 0.0; + float d = FAR_CLIP; float iterationCount = 0.0; for(int j = 0; j < MAX_ITERATIONS; j++) { - float d = FAR_CLIP; evaluateSceneSDF(current, d); if(d < EPSILON) - { - vec3 normal = estimateSceneGradient(current, EPSILON); - - vec3 light = vec3(0.0, 4.0, 3.0); - vec3 l = light - current; - - float falloff = 15.0 / pow(length(l) + EPSILON, 2.0); - float diffuse = clamp(dot(normal, normalize(l)) * falloff, 0.0, 1.0); - float shadow = evaluateShadows(current + normal * .05, light); - - color = vec3(diffuse * shadow); break; - } t += d; current += ray.direction * d; @@ -220,9 +234,30 @@ void main() break; } + // More details in intersections (similar to a discontinuity reduction) + // This GREATLY improves, for example, the gradient estimation for + // big discontinuities such as box edges + for(int k = 0; k < SECONDARY_ITERATIONS; k++) + { + if(t >= FAR_CLIP) + break; + + d = evaluateSceneSDFSimple(current); + + if(d <= 0.0) + break; + + t += d; + current += ray.direction * d; + iterationCount += 1.0; + } + + color = shade(current, ray, t); + + // Gamma correction color = pow(color, vec3(.45454)); - vec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS)); + vec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS)); color = mix(color, debugColor, u_debug); gl_FragColor = vec4(color, 1.0); diff --git a/src/main.js b/src/main.js index 8bfaca4..7f823e3 100644 --- a/src/main.js +++ b/src/main.js @@ -36,6 +36,9 @@ window.addEventListener('load', function() { controls.zoomSpeed = 1.0; controls.panSpeed = 2.0; + camera.fov = 45; + camera.updateProjectionMatrix(); + window.addEventListener('resize', function() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); From fd792c3bde8a02d3dc8ea1ccc96712e98810e27c Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Tue, 28 Feb 2017 03:45:57 -0500 Subject: [PATCH 05/26] + Torus, cylinder --- src/glsl/rayMarch-frag.glsl | 30 ++++++++++++++++++++++++++---- src/main.js | 14 +++++++++++++- src/proxy_geometry.js | 4 ++++ 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/glsl/rayMarch-frag.glsl b/src/glsl/rayMarch-frag.glsl index 8672cd9..e75d042 100644 --- a/src/glsl/rayMarch-frag.glsl +++ b/src/glsl/rayMarch-frag.glsl @@ -1,3 +1,7 @@ +// Note: +// As most of these assignments, this is not intended to be a very optimal approach to this algorithm, +// as I try to be as clear as possible for future reference + #define MAX_GEOMETRY_COUNT 50 #define FAR_CLIP 1000.0 #define MAX_ITERATIONS 64 @@ -8,7 +12,7 @@ // SHADOW PARAMETERS #define SHADOW_ITERATIONS 24 -#define SHADOW_SOFT_FACTOR 8.0 +#define SHADOW_SOFT_FACTOR 6.0 #define SHADOW_EPSILON 0.00 #define SHADOW_OFFSET .005 @@ -24,6 +28,7 @@ uniform vec4 u_buffer[MAX_GEOMETRY_COUNT]; uniform int u_count; uniform float u_debug; +uniform float time; varying vec2 f_uv; varying vec4 f_ndcP; @@ -48,6 +53,7 @@ vec3 debugIterations(float factor) } // All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm +// But they are tweaked for their threejs equivalents float sdSphere( vec3 p ) { return length(p) - 1.0; @@ -63,16 +69,28 @@ float sdPlane( vec3 p) return p.y; } +float sdCappedCylinder( vec3 p) +{ + vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0); + return min(max(d.x,d.y),0.0) + length(max(d,0.0)); +} + +float sdTorus( vec3 p) +{ + vec2 q = vec2(length(p.xz)-1.0,p.y); + return length(q) - .2; +} + float udRoundBox( vec3 p, vec3 b, float r ) { return length(max(abs(p) - b, 0.0)) - r; } -float sdCappedCone( in vec3 p, in vec3 c ) +float sdCappedCone( in vec3 p) { p.y -= .25; vec2 q = vec2( length(p.xz), p.y ); - vec2 v = vec2( c.z*c.y / c.x, -c.z ); + vec2 v = vec2(0.5773502691896258, -0.5773502691896258); vec2 w = v - q; vec2 vv = vec2( dot(v,v), v.x*v.x ); vec2 qv = vec2( dot(v,w), v.x*w.x ); @@ -97,9 +115,13 @@ float evaluateGeometrySDF(vec3 point, vec4 geo) else if(geo.w == 1.0) return sdSphere(localPoint); else if(geo.w == 2.0) - return sdCappedCone(localPoint * .5, normalize(vec3(1.0))); + return sdCappedCone(localPoint * .5); else if(geo.w == 3.0) return sdPlane(localPoint); + else if(geo.w == 4.0) + return sdTorus(localPoint); + else if(geo.w == 5.0) + return sdCappedCylinder(localPoint); return FAR_CLIP; } diff --git a/src/main.js b/src/main.js index 7f823e3..5ec3062 100644 --- a/src/main.js +++ b/src/main.js @@ -12,6 +12,8 @@ var BoxGeometry = new THREE.BoxGeometry(1, 1, 1); var SphereGeometry = new THREE.SphereGeometry(1, 32, 32); var ConeGeometry = new THREE.ConeGeometry(1, 1); var PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 ); +var TorusGeometry = new THREE.TorusGeometry( 1, .2, 16, 16, Math.PI * 2); +var CylinderGeometry = new THREE.CylinderGeometry( 1, 1, 2, 16, 17, false ); window.addEventListener('load', function() { var stats = new Stats(); @@ -39,6 +41,10 @@ window.addEventListener('load', function() { camera.fov = 45; camera.updateProjectionMatrix(); + var v = new THREE.Vector3( 1, 1, 1 ).normalize(); + var v2 = new THREE.Vector2( v.z*v.y / v.x, -v.z ); + console.log(v2); + window.addEventListener('resize', function() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); @@ -64,17 +70,23 @@ window.addEventListener('load', function() { var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial); var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial); var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial); - + var torusMesh = new THREE.Mesh(TorusGeometry, ProxyMaterial); + var cylinderMesh = new THREE.Mesh(CylinderGeometry, ProxyMaterial); planeMesh.rotateX(Math.PI * -.5); planeMesh.position.set(0, -1, 0); boxMesh.position.set(-3, 0, 0); coneMesh.position.set(3, 0, 0); + torusMesh.position.set(0, 0, 4); + torusMesh.rotateX(Math.PI * -.5); + cylinderMesh.position.set(3, 1, 4); proxyGeometry.add(boxMesh); proxyGeometry.add(sphereMesh); proxyGeometry.add(coneMesh); proxyGeometry.add(planeMesh); + proxyGeometry.add(torusMesh); + proxyGeometry.add(cylinderMesh); scene.add(proxyGeometry.group); diff --git a/src/proxy_geometry.js b/src/proxy_geometry.js index 914a094..47b9aae 100644 --- a/src/proxy_geometry.js +++ b/src/proxy_geometry.js @@ -49,6 +49,10 @@ export default class ProxyGeometry { this._buffer[PROXY_BUFFER_SIZE*i+3] = 2; } else if (child.geometry instanceof THREE.PlaneGeometry) { this._buffer[PROXY_BUFFER_SIZE*i+3] = 3; + } else if (child.geometry instanceof THREE.TorusGeometry) { + this._buffer[PROXY_BUFFER_SIZE*i+3] = 4; + } else if (child.geometry instanceof THREE.CylinderGeometry) { + this._buffer[PROXY_BUFFER_SIZE*i+3] = 5; } } } From 13925a889821fadbbddfd558dd7bfdb924e07568 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Tue, 28 Feb 2017 04:15:07 -0500 Subject: [PATCH 06/26] + Some translation animation --- src/main.js | 31 ++++++++++++++++++++++++++++--- src/proxy_geometry.js | 1 + src/rayMarching.js | 3 +++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main.js b/src/main.js index 5ec3062..5e30b2d 100644 --- a/src/main.js +++ b/src/main.js @@ -15,6 +15,13 @@ var PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 ); var TorusGeometry = new THREE.TorusGeometry( 1, .2, 16, 16, Math.PI * 2); var CylinderGeometry = new THREE.CylinderGeometry( 1, 1, 2, 16, 17, false ); +var Engine = +{ + time : 0.0, + deltaTime : 0.0, + clock : null, +} + window.addEventListener('load', function() { var stats = new Stats(); stats.setMode(1); @@ -31,6 +38,8 @@ window.addEventListener('load', function() { renderer.setClearColor(0x999999, 1.0); document.body.appendChild(renderer.domElement); + Engine.clock = new THREE.Clock(); + var controls = new OrbitControls(camera, renderer.domElement); controls.enableDamping = true; controls.enableZoom = true; @@ -41,9 +50,6 @@ window.addEventListener('load', function() { camera.fov = 45; camera.updateProjectionMatrix(); - var v = new THREE.Vector3( 1, 1, 1 ).normalize(); - var v2 = new THREE.Vector2( v.z*v.y / v.x, -v.z ); - console.log(v2); window.addEventListener('resize', function() { camera.aspect = window.innerWidth / window.innerHeight; @@ -81,6 +87,19 @@ window.addEventListener('load', function() { torusMesh.rotateX(Math.PI * -.5); cylinderMesh.position.set(3, 1, 4); + boxMesh.onBeforeRender = function() { + boxMesh.position.y = Math.sin(Engine.time) + 1; + }; + + cylinderMesh.onBeforeRender = function() { + cylinderMesh.position.y = Math.sin(Engine.time + 1.5) + 1; + }; + + sphereMesh.onBeforeRender = function() { + sphereMesh.position.x = Math.sin(Engine.time + .5); + sphereMesh.position.z = Math.cos(Engine.time + .5) - .5; + }; + proxyGeometry.add(boxMesh); proxyGeometry.add(sphereMesh); proxyGeometry.add(coneMesh); @@ -97,6 +116,12 @@ window.addEventListener('load', function() { var rayMarcher = new RayMarcher(renderer, scene, camera); (function tick() { + var deltaTime = Engine.clock.getDelta(); + + Engine.time += deltaTime; + Engine.cameraTime += deltaTime; + Engine.deltaTime = deltaTime; + controls.update(); stats.begin(); proxyGeometry.update(); diff --git a/src/proxy_geometry.js b/src/proxy_geometry.js index 47b9aae..09a04ca 100644 --- a/src/proxy_geometry.js +++ b/src/proxy_geometry.js @@ -28,6 +28,7 @@ export default class ProxyGeometry { const {children} = this.group; for (let i = 0; i < children.length; ++i) { const child = children[i]; + // TODO: animate objects } this.computeBuffer(); diff --git a/src/rayMarching.js b/src/rayMarching.js index c5c8d0b..ff56c61 100644 --- a/src/rayMarching.js +++ b/src/rayMarching.js @@ -32,6 +32,9 @@ export default function RayMarcher(renderer, scene, camera) { fragmentShader: require('./glsl/rayMarch-frag.glsl') }); shaderPass.renderToScreen = true; + + // Adding this composer we force updating the scene transformations + composer.addPass(new EffectComposer.RenderPass(scene, camera)); composer.addPass(shaderPass); var inverseProjectionMatrix = new THREE.Matrix4(); From 6c16f1fdc521830fbfe1ec56b809a3083acc5325 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Tue, 28 Feb 2017 04:32:56 -0500 Subject: [PATCH 07/26] + Implemented ambient occlusion estimation as in the paper "Fast Approximations for lighting of Dynamic Scenes" by Alex Evans --- src/glsl/rayMarch-frag.glsl | 26 ++++++++++++++++++++++---- src/main.js | 3 ++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/glsl/rayMarch-frag.glsl b/src/glsl/rayMarch-frag.glsl index e75d042..216d1ed 100644 --- a/src/glsl/rayMarch-frag.glsl +++ b/src/glsl/rayMarch-frag.glsl @@ -10,6 +10,10 @@ #define NORMAL_ESTIMATION_EPSILON .005 +#define AO_ITERATIONS 5 +#define AO_DELTA .1 +#define AO_DECAY .8 + // SHADOW PARAMETERS #define SHADOW_ITERATIONS 24 #define SHADOW_SOFT_FACTOR 6.0 @@ -175,9 +179,6 @@ vec3 estimateSceneGradient(vec3 point, float epsilon) return normalize(vec3(x,y,z)); } - -// vec3 reduceDiscontinuity(vec3 p, vec3 o, float d, ) - // For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm // with tweaks float evaluateShadows(vec3 origin, vec3 toLight) @@ -211,6 +212,21 @@ float evaluateShadows(vec3 origin, vec3 toLight) return soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft); } +float evaluateAmbientOcclusion(vec3 point, vec3 normal) +{ + float ao = 0.0; + float delta = AO_DELTA; + float decay = 1.0; + + for(int i = 0; i < AO_ITERATIONS; i++) + { + float d = float(i) * delta; + decay *= AO_DECAY; + ao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay; + } + + return clamp(1.0 - ao * .15, 0.0, 1.0); +} vec3 shade(vec3 point, Ray ray, float t) { @@ -223,7 +239,9 @@ vec3 shade(vec3 point, Ray ray, float t) float diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0); float shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l); - return vec3(diffuse * falloff * shadow); + float ao = evaluateAmbientOcclusion(point, normal); + + return vec3(diffuse * falloff * shadow * ao); } void main() diff --git a/src/main.js b/src/main.js index 5e30b2d..5a25012 100644 --- a/src/main.js +++ b/src/main.js @@ -88,7 +88,7 @@ window.addEventListener('load', function() { cylinderMesh.position.set(3, 1, 4); boxMesh.onBeforeRender = function() { - boxMesh.position.y = Math.sin(Engine.time) + 1; + boxMesh.position.y = Math.sin(Engine.time) * 2 + 1; }; cylinderMesh.onBeforeRender = function() { @@ -98,6 +98,7 @@ window.addEventListener('load', function() { sphereMesh.onBeforeRender = function() { sphereMesh.position.x = Math.sin(Engine.time + .5); sphereMesh.position.z = Math.cos(Engine.time + .5) - .5; + sphereMesh.position.y = Math.sin(Engine.time + 2.3) - .5; }; proxyGeometry.add(boxMesh); From 5f9e4b14ab3c248154651b296919b18fab602909 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Tue, 28 Feb 2017 17:49:37 -0500 Subject: [PATCH 08/26] * Arbitrary transformations --- src/glsl/rayMarch-frag.glsl | 21 ++++++++++-------- src/main.js | 43 ++++++++++++++++++++++++++++++------- src/proxy_geometry.js | 39 ++++++++++++++++++++++----------- src/rayMarching.js | 9 ++++++-- 4 files changed, 80 insertions(+), 32 deletions(-) diff --git a/src/glsl/rayMarch-frag.glsl b/src/glsl/rayMarch-frag.glsl index 216d1ed..ea2b04c 100644 --- a/src/glsl/rayMarch-frag.glsl +++ b/src/glsl/rayMarch-frag.glsl @@ -1,5 +1,5 @@ // Note: -// As most of these assignments, this is not intended to be a very optimal approach to this algorithm, +// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm, // as I try to be as clear as possible for future reference #define MAX_GEOMETRY_COUNT 50 @@ -28,6 +28,8 @@ struct Ray { uniform mat4 u_viewProjectionMatrix; uniform vec3 u_cameraPosition; + +uniform mat4 u_transforms[MAX_GEOMETRY_COUNT]; uniform vec4 u_buffer[MAX_GEOMETRY_COUNT]; uniform int u_count; @@ -68,9 +70,11 @@ float udBox( vec3 p) return length(max(abs(p) - vec3(.5), 0.0)); } +// TODO: build a parabola mixed with a plane to solve the +// grazing angle/boundary iteration problem float sdPlane( vec3 p) { - return p.y; + return p.y; } float sdCappedCylinder( vec3 p) @@ -110,9 +114,9 @@ Ray getRay(vec3 origin, vec3 dir) return ray; } -float evaluateGeometrySDF(vec3 point, vec4 geo) +float evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform) { - vec3 localPoint = point - geo.xyz; + vec3 localPoint = (transform * vec4(point, 1.0)).xyz; if(geo.w == 0.0) return udBox(localPoint); @@ -141,7 +145,8 @@ float evaluateSceneSDFSimple(vec3 point) break; vec4 geo = u_buffer[i]; - float d = evaluateGeometrySDF(point, geo); + mat4 transform = u_transforms[i]; + float d = evaluateGeometrySDF(point, geo, transform); minDistance = min(d, minDistance); } @@ -159,7 +164,8 @@ void evaluateSceneSDF(vec3 point, out float minDistance) break; vec4 geo = u_buffer[i]; - float d = evaluateGeometrySDF(point, geo); + mat4 transform = u_transforms[i]; + float d = evaluateGeometrySDF(point, geo, transform); minDistance = min(d, minDistance); } @@ -249,9 +255,6 @@ void main() // Renormalize due to interpolation Ray ray = getRay(f_rayPos, normalize(f_rayDir)); - vec4 tmp = u_viewProjectionMatrix * f_ndcP; - ray.direction = normalize(vec3(tmp.xyz * tmp.w) - u_cameraPosition); - vec3 color; vec3 current = ray.position; diff --git a/src/main.js b/src/main.js index 5a25012..bf268b7 100644 --- a/src/main.js +++ b/src/main.js @@ -73,19 +73,41 @@ window.addEventListener('load', function() { var proxyGeometry = new ProxyGeometry(); var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial); + boxMesh.userData = { geoType : 0 } + var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial); + sphereMesh.userData = { geoType : 1 } + var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial); + coneMesh.userData = { geoType : 2} + + var cylinderMesh = new THREE.Mesh(CylinderGeometry, ProxyMaterial); + cylinderMesh.userData = { geoType : 5 } + var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial); var torusMesh = new THREE.Mesh(TorusGeometry, ProxyMaterial); - var cylinderMesh = new THREE.Mesh(CylinderGeometry, ProxyMaterial); + // These transformations need to be hidden + var g1 = new THREE.Group(); planeMesh.rotateX(Math.PI * -.5); - planeMesh.position.set(0, -1, 0); + g1.add(planeMesh); + g1.userData = { geoType : 3 }; + + var torusWrapper = new THREE.Group(); + torusMesh.rotateX(Math.PI * -.5); + torusWrapper.add(torusMesh); + torusWrapper.userData = { geoType : 4 }; + + g1.position.set(0, -1, 0); boxMesh.position.set(-3, 0, 0); coneMesh.position.set(3, 0, 0); - torusMesh.position.set(0, 0, 4); - torusMesh.rotateX(Math.PI * -.5); - cylinderMesh.position.set(3, 1, 4); + torusWrapper.position.set(0, 0, 4); + cylinderMesh.position.set(4, 1, 4); + + coneMesh.onBeforeRender = function() { + var scale = Math.sin(Engine.time) * .35 + 1 + coneMesh.scale.set(scale, scale, scale); + } boxMesh.onBeforeRender = function() { boxMesh.position.y = Math.sin(Engine.time) * 2 + 1; @@ -93,6 +115,7 @@ window.addEventListener('load', function() { cylinderMesh.onBeforeRender = function() { cylinderMesh.position.y = Math.sin(Engine.time + 1.5) + 1; + cylinderMesh.rotateX(Engine.deltaTime * Math.PI); }; sphereMesh.onBeforeRender = function() { @@ -101,11 +124,15 @@ window.addEventListener('load', function() { sphereMesh.position.y = Math.sin(Engine.time + 2.3) - .5; }; + torusMesh.onBeforeRender = function() { + torusWrapper.rotateZ(Engine.deltaTime * Math.PI); + }; + proxyGeometry.add(boxMesh); proxyGeometry.add(sphereMesh); proxyGeometry.add(coneMesh); - proxyGeometry.add(planeMesh); - proxyGeometry.add(torusMesh); + proxyGeometry.add(g1); + proxyGeometry.add(torusWrapper); proxyGeometry.add(cylinderMesh); scene.add(proxyGeometry.group); @@ -130,7 +157,7 @@ window.addEventListener('load', function() { if (options.strategy === 'Proxy Geometry') { renderer.render(scene, camera); } else if (options.strategy === 'Ray Marching') { - rayMarcher.render(proxyGeometry.buffer, camera, options); + rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options); } stats.end(); requestAnimationFrame(tick); diff --git a/src/proxy_geometry.js b/src/proxy_geometry.js index 09a04ca..6ddcf23 100644 --- a/src/proxy_geometry.js +++ b/src/proxy_geometry.js @@ -10,17 +10,20 @@ export default class ProxyGeometry { constructor(bounds) { this.group = new THREE.Group(); this._buffer = new Float32Array(); + this._transforms = new Float32Array(); } add(mesh) { this.group.add(mesh); this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length); + this._transforms = new Float32Array(16 * this.group.children.length); this.computeBuffer(); } remove(mesh) { this.group.remove(mesh); this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length); + this._transforms = new Float32Array(16 * this.group.children.length); this.computeBuffer(); } @@ -36,29 +39,39 @@ export default class ProxyGeometry { computeBuffer() { const {children} = this.group; + for (let i = 0; i < children.length; ++i) { const child = children[i]; this._buffer[PROXY_BUFFER_SIZE*i] = child.position.x; this._buffer[PROXY_BUFFER_SIZE*i+1] = child.position.y; this._buffer[PROXY_BUFFER_SIZE*i+2] = child.position.z; - if (child.geometry instanceof THREE.BoxGeometry) { - this._buffer[PROXY_BUFFER_SIZE*i+3] = 0; - } else if (child.geometry instanceof THREE.SphereGeometry) { - this._buffer[PROXY_BUFFER_SIZE*i+3] = 1; - } else if (child.geometry instanceof THREE.ConeGeometry) { - this._buffer[PROXY_BUFFER_SIZE*i+3] = 2; - } else if (child.geometry instanceof THREE.PlaneGeometry) { - this._buffer[PROXY_BUFFER_SIZE*i+3] = 3; - } else if (child.geometry instanceof THREE.TorusGeometry) { - this._buffer[PROXY_BUFFER_SIZE*i+3] = 4; - } else if (child.geometry instanceof THREE.CylinderGeometry) { - this._buffer[PROXY_BUFFER_SIZE*i+3] = 5; - } + var worldToLocal = new THREE.Matrix4(); + worldToLocal.getInverse(child.matrixWorld); + worldToLocal.toArray(this._transforms, i * 16); + + this._buffer[PROXY_BUFFER_SIZE*i+3] = child.userData.geoType; + // if (child.geometry instanceof THREE.BoxGeometry) { + // } else if (child.geometry instanceof THREE.SphereGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 1; + // } else if (child.geometry instanceof THREE.ConeGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 2; + // } else if (child.geometry instanceof THREE.PlaneGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 3; + // } else if (child.geometry instanceof THREE.TorusGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 4; + // } else if (child.geometry instanceof THREE.CylinderGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 5; + // } } } get buffer() { return this._buffer; } + + get transforms() + { + return this._transforms; + } } \ No newline at end of file diff --git a/src/rayMarching.js b/src/rayMarching.js index ff56c61..d5e387c 100644 --- a/src/rayMarching.js +++ b/src/rayMarching.js @@ -9,7 +9,7 @@ export default function RayMarcher(renderer, scene, camera) { uniforms: { u_buffer: { type: '4fv', - value: undefined + value: new Float32Array() }, u_count: { type: 'i', @@ -26,6 +26,10 @@ export default function RayMarcher(renderer, scene, camera) { u_cameraPosition : { type: 'v3', value: new THREE.Vector3(0,0,0) + }, + u_transforms : { + type: 'm4v', + value: new Float32Array() } }, vertexShader: require('./glsl/pass-vert.glsl'), @@ -40,9 +44,10 @@ export default function RayMarcher(renderer, scene, camera) { var inverseProjectionMatrix = new THREE.Matrix4(); return { - render: function(buffer, camera, options) { + render: function(buffer, transforms, camera, options) { shaderPass.material.uniforms.u_buffer.value = buffer; + shaderPass.material.uniforms.u_transforms.value = transforms; shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE; shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; From 8cd0c2ee8ee2b764d9ca5e742cb7beb167514a73 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Tue, 28 Feb 2017 18:11:33 -0500 Subject: [PATCH 09/26] + Added repetition for base scene --- src/glsl/rayMarch-frag.glsl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/glsl/rayMarch-frag.glsl b/src/glsl/rayMarch-frag.glsl index ea2b04c..3ce8e27 100644 --- a/src/glsl/rayMarch-frag.glsl +++ b/src/glsl/rayMarch-frag.glsl @@ -28,7 +28,6 @@ struct Ray { uniform mat4 u_viewProjectionMatrix; uniform vec3 u_cameraPosition; - uniform mat4 u_transforms[MAX_GEOMETRY_COUNT]; uniform vec4 u_buffer[MAX_GEOMETRY_COUNT]; uniform int u_count; @@ -116,6 +115,8 @@ Ray getRay(vec3 origin, vec3 dir) float evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform) { + vec3 rep = vec3(18.0, 100.0, 18.0); + point = mod(point + rep * .5, rep) - rep * .5; vec3 localPoint = (transform * vec4(point, 1.0)).xyz; if(geo.w == 0.0) From 339dfe5d89cf0d5364870ae748572f25eded76a3 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 01:21:29 -0500 Subject: [PATCH 10/26] + Banana? --- src/glsl/minion.frag.glsl | 391 ++++++++++++++++++++++++++++++++++++++ src/main.js | 8 +- src/rayMarching.js | 71 ++++++- 3 files changed, 457 insertions(+), 13 deletions(-) create mode 100644 src/glsl/minion.frag.glsl diff --git a/src/glsl/minion.frag.glsl b/src/glsl/minion.frag.glsl new file mode 100644 index 0000000..8b986ef --- /dev/null +++ b/src/glsl/minion.frag.glsl @@ -0,0 +1,391 @@ +// Note: +// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm, +// as I try to be as clear as possible for future reference + +#define MAX_GEOMETRY_COUNT 50 +#define FAR_CLIP 1000.0 +#define MAX_ITERATIONS 64 +#define SECONDARY_ITERATIONS 3 +#define EPSILON 0.005 + +#define NORMAL_ESTIMATION_EPSILON .005 + +#define AO_ITERATIONS 5 +#define AO_DELTA .1 +#define AO_DECAY .8 + +// SHADOW PARAMETERS +#define SHADOW_ITERATIONS 24 +#define SHADOW_SOFT_FACTOR 6.0 +#define SHADOW_EPSILON 0.00 +#define SHADOW_OFFSET .005 + +struct Ray { + vec3 position; + vec3 direction; +}; + +uniform mat4 u_viewProjectionMatrix; +uniform vec3 u_cameraPosition; + +uniform mat4 u_transforms[MAX_GEOMETRY_COUNT]; +uniform vec4 u_buffer[MAX_GEOMETRY_COUNT]; +uniform int u_count; + +uniform float u_debug; +uniform float time; + +varying vec2 f_uv; +varying vec4 f_ndcP; + +varying vec3 f_rayPos; +varying vec3 f_rayDir; + +// Reference: https://github.com/stackgl/glsl-smooth-min +float smin(float a, float b, float k) +{ + float res = exp(-k * a) + exp(-k * b); + return -log(res) / k; +} + +// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm +vec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d) +{ + return saturate(a + b * cos(6.28318 * ( c * t + d))); +} + +vec3 debugIterations(float factor) +{ + vec3 a = vec3(0.478, 0.500, 0.500); + vec3 b = vec3(0.500); + vec3 c = vec3(0.688, 0.748, 0.748); + vec3 d = vec3(0.318, 0.588, 0.908); + + return palette(factor, a, b, c, d); +} + +// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm +// But they are tweaked for their threejs equivalents +float sdSphere( vec3 p ) +{ + return length(p) - 1.0; +} + +float udBox(vec3 p, vec3 b) +{ + return length(max(abs(p) - b, 0.0)); +} + +// TODO: build a parabola mixed with a plane to solve the +// grazing angle/boundary iteration problem +float sdPlane( vec3 p) +{ + return p.y; +} + +float sdCappedCylinder( vec3 p) +{ + vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0); + return min(max(d.x,d.y),0.0) + length(max(d,0.0)); +} + +float sdTorus( vec3 p) +{ + vec2 q = vec2(length(p.xz)-1.0,p.y); + return length(q) - .2; +} + +float sdHexPrism( vec3 p, vec2 h ) +{ + vec3 q = abs(p); + return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x); +} + +float udRoundBox( vec3 p, vec3 b, float r ) +{ + return length(max(abs(p) - b, 0.0)) - r; +} + +float sdCappedCone( in vec3 p) +{ + p.y -= .25; + vec2 q = vec2( length(p.xz), p.y ); + vec2 v = vec2(0.5773502691896258, -0.5773502691896258); + vec2 w = v - q; + vec2 vv = vec2( dot(v,v), v.x*v.x ); + vec2 qv = vec2( dot(v,w), v.x*w.x ); + vec2 d = max(qv,0.0) * qv / vv; + return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y)); +} + +float sdCapsule( vec3 p, vec3 a, vec3 b, float r ) +{ + vec3 pa = p - a, ba = b - a; + float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 ); + return length( pa - ba*h ) - r; +} + +Ray getRay(vec3 origin, vec3 dir) +{ + Ray ray; + ray.position = origin; + ray.direction = dir; + return ray; +} + +float opUnion( float d1, float d2 ) +{ + return min(d1, d2); +} + +float evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform) +{ + vec3 rep = vec3(18.0, 100.0, 18.0); + point = mod(point + rep * .5, rep) - rep * .5; + vec3 localPoint = (transform * vec4(point, 1.0)).xyz; + + // if(geo.w == 0.0) + // return udBox(localPoint); + // else if(geo.w == 1.0) + // return sdSphere(localPoint); + // else if(geo.w == 2.0) + // return sdCappedCone(localPoint * .5); + // else if(geo.w == 3.0) + // return sdPlane(localPoint); + // else if(geo.w == 4.0) + // return sdTorus(localPoint); + // else if(geo.w == 5.0) + // return sdCappedCylinder(localPoint); + + return FAR_CLIP; +} + +vec3 opCheapBend( vec3 p, float magnitude) +{ + float c = cos(magnitude * p.y); + float s = sin(magnitude * p.y); + mat2 m = mat2(c, -s, s, c); + vec3 q = vec3( m * p.xy, p.z); + return q; +} + +float repeatDimension(float x, float m, float extent) +{ + return mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent)); +} + +float railingSDF(vec3 point) +{ + float base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5)); + base = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25))); + base = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5))); + + vec3 columnPoint = point + vec3(3.0, 1.25, -2.5); + columnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0)); + columnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0)); + + float column = udBox(columnPoint, vec3(.35, 50.0, .35)); + column = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5))); + column = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5))); + + base = min(base, column); + + vec3 rep = vec3(1.0, 100.0, 10.0); + + vec3 screwPoint = (point + vec3(0.0, 1.15, -1.5)).xzy; + screwPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5; + float screws1 = sdHexPrism(screwPoint, vec2(.1)); + screwPoint.y += 4.25; + float screws2 = sdHexPrism(screwPoint, vec2(.1)); + + return min(min(base, screws1), screws2); +} + +float minionBaseSDF(vec3 point) +{ + vec3 blendOffset = vec3(0.0, 1.5, 0.0); + vec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset; + vec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset; + + float base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15); + + float hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135); + float hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135); + + float foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2); + float foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2); + + float dist = smin(base, hand1, 5.0); + dist = smin(dist, hand2, 5.0); + dist = smin(dist, foot1, 5.0); + dist = smin(dist, foot2, 5.0); + + + return dist; +} + +// Assumes minDistance was initialized to FAR_CLIP +// TODO: add material types +void evaluateSceneSDF(vec3 point, out float minDistance) +{ + minDistance = FAR_CLIP; + minDistance = min(minDistance, minionBaseSDF(point)); + minDistance = min(minDistance, railingSDF(point)); + + // for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) + // { + // if (i >= u_count) + // break; + + // vec4 geo = u_buffer[i]; + // mat4 transform = u_transforms[i]; + // float d = evaluateGeometrySDF(point, geo, transform); + + // minDistance = min(d, minDistance); + // } +} + +// This method is useful for just the distance +float evaluateSceneSDFSimple(vec3 point) +{ + // TODO: rewrite everything + float minDistance = FAR_CLIP; + evaluateSceneSDF(point, minDistance); + return minDistance; +} + +vec3 estimateSceneGradient(vec3 point, float epsilon) +{ + float x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z)); + x -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z)); + + float y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z)); + y -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z)); + + float z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon)); + z -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon)); + + return normalize(vec3(x,y,z)); +} + +// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm +// with tweaks +float evaluateShadows(vec3 origin, vec3 toLight) +{ + vec3 direction = toLight; + float maxDistance = length(direction); + direction /= maxDistance; + + float t = SHADOW_EPSILON; + float soft = .5; + + // WebGL doesnt like loops that cannot be easily unrolled + for(int i = 0; i < SHADOW_ITERATIONS; i++) + { + float d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance); + + if(d < SHADOW_EPSILON) + break; + + soft = min(soft, SHADOW_SOFT_FACTOR * (d / t)); + + if(t >= maxDistance) + break; + + t += d; + } + + soft = clamp(soft * 2.0, 0.0, 1.0); + + // This is a mix of soft shadows and a fake AO + return soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft); +} + +float evaluateAmbientOcclusion(vec3 point, vec3 normal) +{ + float ao = 0.0; + float delta = AO_DELTA; + float decay = 1.0; + + for(int i = 0; i < AO_ITERATIONS; i++) + { + float d = float(i) * delta; + decay *= AO_DECAY; + ao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay; + } + + return clamp(1.0 - ao * .15, 0.0, 1.0); +} + +vec3 shade(vec3 point, Ray ray, float t) +{ + vec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON ); + + vec3 light = vec3(1.0, 5.0, 7.0); + vec3 l = light - point; + + float diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0); + + float falloff = 25.0 / pow(length(l) + EPSILON, 2.0); + float shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l); + + float ao = evaluateAmbientOcclusion(point, normal); + + return vec3(diffuse * falloff * shadow * ao); +} + +void main() +{ + // Renormalize due to interpolation + Ray ray = getRay(f_rayPos, normalize(f_rayDir)); + + vec3 color; + vec3 current = ray.position; + + float t = 0.0; + float d = FAR_CLIP; + float iterationCount = 0.0; + + for(int j = 0; j < MAX_ITERATIONS; j++) + { + evaluateSceneSDF(current, d); + + if(d < EPSILON) + break; + + t += d; + current += ray.direction * d; + iterationCount += 1.0; + + if(t >= FAR_CLIP) + break; + } + + // More details in intersections (similar to a discontinuity reduction) + // This GREATLY improves, for example, the gradient estimation for + // big discontinuities such as box edges + for(int k = 0; k < SECONDARY_ITERATIONS; k++) + { + if(t >= FAR_CLIP) + break; + + d = evaluateSceneSDFSimple(current); + + if(d <= 0.0) + break; + + t += d; + current += ray.direction * d; + iterationCount += 1.0; + } + + color = shade(current, ray, t); + + // Gamma correction + color = pow(color, vec3(.45454)); + + vec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS)); + color = mix(color, debugColor, u_debug); + + gl_FragColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/src/main.js b/src/main.js index bf268b7..ecc31ab 100644 --- a/src/main.js +++ b/src/main.js @@ -60,11 +60,11 @@ window.addEventListener('load', function() { var gui = new DAT.GUI(); var options = { - strategy: 'Ray Marching', + strategy: 'Scene', debug : false } - gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching']); + gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Scene']); gui.add(options, 'debug'); scene.add(new THREE.AxisHelper(20)); @@ -157,7 +157,9 @@ window.addEventListener('load', function() { if (options.strategy === 'Proxy Geometry') { renderer.render(scene, camera); } else if (options.strategy === 'Ray Marching') { - rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options); + rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false); + } else if (options.strategy === 'Scene') { + rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true); } stats.end(); requestAnimationFrame(tick); diff --git a/src/rayMarching.js b/src/rayMarching.js index d5e387c..1c21b3d 100644 --- a/src/rayMarching.js +++ b/src/rayMarching.js @@ -4,6 +4,41 @@ const EffectComposer = require('three-effectcomposer')(THREE) import {PROXY_BUFFER_SIZE} from './proxy_geometry' export default function RayMarcher(renderer, scene, camera) { + + var minionComposer = new EffectComposer(renderer); + var minionPass = new EffectComposer.ShaderPass({ + uniforms: { + u_buffer: { + type: '4fv', + value: new Float32Array() + }, + u_count: { + type: 'i', + value: 0 + }, + u_debug: { + type: 'f', + value: 0 + }, + u_viewProjectionMatrix : { + type: 'm4', + value: new THREE.Matrix4() + }, + u_cameraPosition : { + type: 'v3', + value: new THREE.Vector3(0,0,0) + }, + u_transforms : { + type: 'm4v', + value: new Float32Array() + } + }, + vertexShader: require('./glsl/pass-vert.glsl'), + fragmentShader: require('./glsl/minion.frag.glsl') + }); + minionPass.renderToScreen = true; + minionComposer.addPass(minionPass); + var composer = new EffectComposer(renderer); var shaderPass = new EffectComposer.ShaderPass({ uniforms: { @@ -44,21 +79,37 @@ export default function RayMarcher(renderer, scene, camera) { var inverseProjectionMatrix = new THREE.Matrix4(); return { - render: function(buffer, transforms, camera, options) { - - shaderPass.material.uniforms.u_buffer.value = buffer; - shaderPass.material.uniforms.u_transforms.value = transforms; - shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE; - shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + render: function(buffer, transforms, camera, options, minionScene) + { camera.updateMatrix(); camera.updateProjectionMatrix(); - inverseProjectionMatrix.getInverse(camera.projectionMatrix); - shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); - shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); - composer.render(); + if(minionScene) + { + minionPass.material.uniforms.u_buffer.value = buffer; + minionPass.material.uniforms.u_transforms.value = transforms; + minionPass.material.uniforms.u_count.value = 0; + minionPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + + minionPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); + minionPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); + + minionComposer.render(); + } + else + { + shaderPass.material.uniforms.u_buffer.value = buffer; + shaderPass.material.uniforms.u_transforms.value = transforms; + shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE; + shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + + shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); + shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); + + composer.render(); + } } } } \ No newline at end of file From e9f08755b49484a58dfe25bfe73d9cb485ef1ac5 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 03:01:43 -0500 Subject: [PATCH 11/26] + Bbbbanana? --- src/glsl/minion.frag.glsl | 124 +++++++++++++++++++++++++++++++++++--- 1 file changed, 115 insertions(+), 9 deletions(-) diff --git a/src/glsl/minion.frag.glsl b/src/glsl/minion.frag.glsl index 8b986ef..db9fe6e 100644 --- a/src/glsl/minion.frag.glsl +++ b/src/glsl/minion.frag.glsl @@ -66,9 +66,9 @@ vec3 debugIterations(float factor) // All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm // But they are tweaked for their threejs equivalents -float sdSphere( vec3 p ) +float sdSphere( vec3 p, float r ) { - return length(p) - 1.0; + return length(p) - r; } float udBox(vec3 p, vec3 b) @@ -83,12 +83,33 @@ float sdPlane( vec3 p) return p.y; } -float sdCappedCylinder( vec3 p) +float sdCappedCylinder( vec3 p, vec2 h) { - vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0); + vec2 d = abs(vec2(length(p.xz),p.y)) - h; return min(max(d.x,d.y),0.0) + length(max(d,0.0)); } +float pow8(float x) +{ + x *= x; // xˆ2 + x *= x; // xˆ4 + return x * x; +} + +float length8(vec2 v) +{ + return pow(pow8(v.x) + pow8(v.y), .125); +} +// float wheelDistance(Point3 X, Point3 C, float r, float R) { +// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R; +// } + +float sdTorus82( vec3 p, vec2 t ) +{ + vec2 q = vec2(length(p.xz)-t.x,p.y); + return length8(q)-t.y; +} + float sdTorus( vec3 p) { vec2 q = vec2(length(p.xz)-1.0,p.y); @@ -174,12 +195,66 @@ float repeatDimension(float x, float m, float extent) return mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent)); } +float backgroundSDF(vec3 point) +{ + float base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5)); + base = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0)); + base = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5))); + + return base; +} + +float singleTrackSDF(vec3 point) +{ + float base = udBox(point, vec3(20.0, .3, .3)); + base = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5))); + base = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5))); + + vec3 detailP = point + vec3(0.0, 0.0, -0.3); + detailP.x = repeatDimension(detailP.x, 1.0, 50.0); + base = min(base, udBox(detailP, vec3(.075, .3, .1))); + + detailP = point + vec3(0.5, .35, -.3); + detailP.x = repeatDimension(detailP.x, 1.0, 50.0); + base = min(base, sdSphere(detailP, .1)); + + detailP = point + vec3(0.75, .35, .3); + detailP.x = repeatDimension(detailP.x, 1.0, 50.0); + base = min(base, sdSphere(detailP, .1)); + + return base; +} + +float tracksSDF(vec3 point) +{ + float base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0)); + base = min(base, singleTrackSDF(point - vec3(0.0, 10.0, 6.0))); + + return base; +} + float railingSDF(vec3 point) { float base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5)); + + base = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2))); + base = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2))); + base = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25))); base = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5))); + + // Railing bump map ;) + vec3 bumpPoint = point + vec3(0.0, 1.15, 0.0); + bumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5); + bumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0); + base = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0); + + bumpPoint = point + vec3(0.25, 1.15, 0.25); + bumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5); + bumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0); + base = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0); + vec3 columnPoint = point + vec3(3.0, 1.25, -2.5); columnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0)); columnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0)); @@ -192,7 +267,7 @@ float railingSDF(vec3 point) vec3 rep = vec3(1.0, 100.0, 10.0); - vec3 screwPoint = (point + vec3(0.0, 1.15, -1.5)).xzy; + vec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy; screwPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5; float screws1 = sdHexPrism(screwPoint, vec2(.1)); screwPoint.y += 4.25; @@ -220,6 +295,35 @@ float minionBaseSDF(vec3 point) dist = smin(dist, foot1, 5.0); dist = smin(dist, foot2, 5.0); + // Left Hand + bendedPointSym.y -= .15; + float handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05)); + handBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5); + + // Base + handBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0); + + // Fingers (note: cylinders would make it better.. but no time!) + handBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0); + handBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0); + handBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0); + + dist = min(dist, handBase1); + + // Right Hand + bendedPoint.y -= .15; + float handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05)); + handBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5); + + // Base + handBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0); + + // Fingers + handBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0); + handBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0); + handBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0); + + dist = min(dist, handBase2); return dist; } @@ -231,6 +335,8 @@ void evaluateSceneSDF(vec3 point, out float minDistance) minDistance = FAR_CLIP; minDistance = min(minDistance, minionBaseSDF(point)); minDistance = min(minDistance, railingSDF(point)); + minDistance = min(minDistance, backgroundSDF(point)); + minDistance = min(minDistance, tracksSDF(point)); // for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) // { @@ -326,12 +432,12 @@ vec3 shade(vec3 point, Ray ray, float t) float diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0); - float falloff = 25.0 / pow(length(l) + EPSILON, 2.0); - float shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l); + // float falloff = 25.0 / pow(length(l) + EPSILON, 2.0); + // float shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l); - float ao = evaluateAmbientOcclusion(point, normal); + // float ao = evaluateAmbientOcclusion(point, normal); - return vec3(diffuse * falloff * shadow * ao); + return vec3(diffuse);// * falloff * shadow * ao); } void main() From adef6e1b84ccd872919a61b4654caf0c26584515 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 03:29:46 -0500 Subject: [PATCH 12/26] + Papple? --- src/glsl/minion.frag.glsl | 43 ++++++++++++++++++++++++++++----------- src/main.js | 5 +++-- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/glsl/minion.frag.glsl b/src/glsl/minion.frag.glsl index db9fe6e..90eaffe 100644 --- a/src/glsl/minion.frag.glsl +++ b/src/glsl/minion.frag.glsl @@ -4,21 +4,21 @@ #define MAX_GEOMETRY_COUNT 50 #define FAR_CLIP 1000.0 -#define MAX_ITERATIONS 64 -#define SECONDARY_ITERATIONS 3 -#define EPSILON 0.005 +#define MAX_ITERATIONS 32 +#define SECONDARY_ITERATIONS 1 +#define EPSILON 0.01 #define NORMAL_ESTIMATION_EPSILON .005 -#define AO_ITERATIONS 5 -#define AO_DELTA .1 +#define AO_ITERATIONS 4 +#define AO_DELTA .133 #define AO_DECAY .8 // SHADOW PARAMETERS -#define SHADOW_ITERATIONS 24 +#define SHADOW_ITERATIONS 20 #define SHADOW_SOFT_FACTOR 6.0 #define SHADOW_EPSILON 0.00 -#define SHADOW_OFFSET .005 +#define SHADOW_OFFSET .01 struct Ray { vec3 position; @@ -154,6 +154,11 @@ Ray getRay(vec3 origin, vec3 dir) return ray; } +float sdEllipsoid( in vec3 p, in vec3 r ) +{ + return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z); +} + float opUnion( float d1, float d2 ) { return min(d1, d2); @@ -228,7 +233,7 @@ float singleTrackSDF(vec3 point) float tracksSDF(vec3 point) { float base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0)); - base = min(base, singleTrackSDF(point - vec3(0.0, 10.0, 6.0))); + // base = min(base, singleTrackSDF(point - vec3(0.0, 8.0, 6.0))); return base; } @@ -325,6 +330,20 @@ float minionBaseSDF(vec3 point) dist = min(dist, handBase2); + vec3 glassPoint = point - vec3(0.0, 3.0, 1.15); + float glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1)); + + float belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125)); + belt = max(belt, -sdSphere(glassPoint, .5)); + glassBase = min(glassBase, belt); + dist = min(dist, glassBase); + + dist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55)); + + float mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0)); + + dist = max(dist, -mouth); + return dist; } @@ -432,12 +451,12 @@ vec3 shade(vec3 point, Ray ray, float t) float diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0); - // float falloff = 25.0 / pow(length(l) + EPSILON, 2.0); - // float shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l); + float falloff = 25.0 / pow(length(l) + EPSILON, 2.0); + float shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l); - // float ao = evaluateAmbientOcclusion(point, normal); + float ao = evaluateAmbientOcclusion(point, normal); - return vec3(diffuse);// * falloff * shadow * ao); + return vec3(diffuse * falloff * shadow * ao); } void main() diff --git a/src/main.js b/src/main.js index ecc31ab..f97fe7c 100644 --- a/src/main.js +++ b/src/main.js @@ -137,9 +137,10 @@ window.addEventListener('load', function() { scene.add(proxyGeometry.group); - camera.position.set(5, 10, 15); + controls.target.set(0,1.5,0); + + camera.position.set(2, 6, 15); camera.lookAt(new THREE.Vector3(0,0,0)); - controls.target.set(0,0,0); var rayMarcher = new RayMarcher(renderer, scene, camera); From ea82545839a868b94c2705a43f4856c00341acb0 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 04:38:31 -0500 Subject: [PATCH 13/26] + Banana! --- images/gradients.png | Bin 0 -> 83030 bytes images/gradients.psd | Bin 0 -> 5329387 bytes src/glsl/minion.frag.glsl | 129 +++++++++++++++++++++----------------- src/main.js | 8 +-- src/rayMarching.js | 18 +++++- 5 files changed, 92 insertions(+), 63 deletions(-) create mode 100644 images/gradients.png create mode 100644 images/gradients.psd diff --git a/images/gradients.png b/images/gradients.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f3ea992eb8287bd0307f5ef18d584966010f51 GIT binary patch literal 83030 zcmeFa1yo$iwy52>1-GEVA-KD{JAnjkq=De>?gS^e21sxT5C~3y1PCq(?i$=3`tNMz z?6c3!x$nIHy>Z`2j}f|3YtC6!U(K4UW-Z1dLRDD?6`2qj005xM$x5mN0ML*k6aWz( z^7S!p&>ZrGWH0;F2>?LB{{9aNke>Mv06H`x_5o8$3YMrR zHykD=#y<*IjqyPw@+874d0tFVet6{P>m{#ztFO)H>jQW1CWJT2jpE^WY}imk^l<d*|Cw%Xvq z6voCYcWXnX_M!m5lC$r~9V1H(p}zpUzs+49^&YH+0ZOjR`3q1ry68JV?zd^}WBc!H zq+Z1}Oiit=u1?B#iR%JCYx~@pcNn&7-&$Y#3f`QbF19XH1+eP}$iQAKcJ!Ypz9t?@ zKngaVU5}NysYe0dkc?4u$r(53(BrJAVL8M|rbivKzov)~Pk8*1dK7HByuf%3BfP)` zsCq68OLgi;{4*t6795+M_XdXuU@hvPZuHB4&S}YYsqy73)F729i&QLm5ZvP{ttQ zr-fXQe~^X6dO=0j8;+w!p%Bj{%cdTwNv0)BawOyk%@?L8-54*>17Hul32l~Pdl^uz zCN%!wokT+s4`Hx$9?Gz(Gh2ErUT(&)V=bXj6!)u*;Zh6q=~!WjZr1kAhX@>9)~w8* zI>q1eG9o3K^u47hdru|}mwZPh8iF&1ZV$`Vp0_D-8xRU`1dWF%wg30cir?Of$pC0Zpv(nZcP7Ii4N z&{(EZ|NLB@U=3r9a}C}sm0e6LKV5yU=#?fWSL`$K@>g~0m1vvatg1@ z^OD90E$}VQEh{&j8!_jSNR?BDwMYBD$!w-JB%jBglA&@X(yV?O|oA z;v0go7X;m!tUPSnsT*nNX?9vV^mX*!xbdHnljM_Vl8ES8G>c2#l+2f)XdP?yX~q^C zX!uk}YjJ3-6eEo%mui({scvf!X_yxa6or+T7ujiw6!<>9jevjJso1F^QJ|Ll)^Mfy z6B&vLL5({jxfN<@s7nA>7tPy&DQ{Q$rqo-KrWZmb#jp4zIOI9BYt)Zlf2&~_ zShqZ_9<7Xd>>ym$hQ^e}Tp@BHo{|v%X$5nM)oY?xO_FYHwuO7C*{uft*@||B^Byf5 zSHwOnx0<&$SB0lC4|L#b9#Fy0JQ#c^_>s%OPLPD9d*)D0Lcdc~;x#Y{n6eZc-!LMW z|3x}l8a>MLlimu|ip?jRPx&FP=iZyvu9P!v$?9_Sy)8~B>Wl_A77 z!M>5Pkuj06P;d0i{TX9jQQdnpx$4ztZ=UYeHQRjdXcdIrZ13@}@$} z!Up9;<Vy-iUF*M1sQit95xXUt2BV$a)9N)abDd;%- zMTA0NA9IQ@a|Y3;xt^9)dFN9H{Uy)Q)2xh|jE>!+naVxxJcoZse|!@mS`cWzMEf%5rFH!7oENjXhXt6v_nN= z?89{kN7z!h+(u?4oE9XnB$FlQGtAjk_$ry?x#)#Un4b$y^E7fcihN=QJ?;OZlcghP ztw7AjOkcrmYu&nVvwIx2oVARy;)S2e(xY$h@oKQ+B%~0pm>G+aKUq{UT$%UfffxpT z5ndGa5w;t346;WDNryQF%Lw;K_@sm$J*o1MEWMIv!cKfMmj~5Hj@OK94Z*absA&FX~xHlMs5XYU0Y^ zo-!fViND#@d`34xk5FxHrVVNvi1^HxT$;@=u-jkrc_xl0b3X^Xi`9X(lu-9NR6(1G zL}$IF>^Wbxpo7N@@(L~-L+BIuGQszeb@Vo0R7!WXQ!0F0Xgrmy0t`NU4*c*A%4!=$ z3wbTXXM1*HS6@Yk<>|sZ;8kcAkuYvVWChL)ehRMNB;Bn08c~?t=eD%jm$k*ET@9u~ zpi$7b^?9ajU9{wql=T!eThyuPTGWLnwY#ThQZp8~J@zZZwhUVLqt?5ueK#glZd9%4%umad z_L3f}-_DU1&Ph@Er(L7G%9aqu9=Vd3ldwD&Pd`eR&d^A|)-~2`ROuHU`MNdlc_TCP z2tAWi@TrIVv1YI3^tZsVMDwGesH~(cA7AFnS)-Y}IsjZNAI1Fs%O@)wcl%}SMnR$Y&mZU-X)HybT?%-rB^iQSvBl=w!HHKoqr?B<{6wj zY4JG31AqOJ%_lV1a_nh${_*^D0dLONk@j}5uW8DScCWlyrP=UAbXROjVlM29i0<9& zMR^LDq~`PA`=w6)irgU#UN$@T6Bw^=um z{rm-Vl~r#tKRU3*<=az@;lk@gg2Y5HEKKV0jR^gqnU=M zvZjfrl?k6Ig@`b+pgTXrfQ^|mkj&l2+SZBRU5MfryZn&y_i7djvR_1;t%NAVzBfpw zqohhEVdrQ@#>LFdWWvVAM#jU(%*Msb!Oq1<#?H#d#lp(R!p6$P%Er&e%FoV9_S=U- z7#UI$bTkF=t4m7%)*R%2LKGIx&i4E)EN*UY%x)aac8=yOYSlk!{WnZO#Q)Zi{qL#F z-}mc}%l{IivnA+XbmaS$f2n5XZuu|NzF+xO?H8Z=b*cp+)cGYG&4A8!j+%CM*22HK z>z|1jBoF)Uo@8{|mbRvLZcdK{S^lc>r{nx-%}f&LY$goR z)AygO_l*21`4<~XkVRw)bO!#76%G!5R`&Z={z3MycI-?oK_35>l|Lo#*)TQX2iZB= z0G)*`ZGh%xEcUkMf-HYl-jn>rd->&Tot%NTCT4Py!jKAPOG{IJ5Gy+yCmS0VgaaoB z6AvpV4-+2`uL%>#l-HQm3}_1C;4=LMhmz8L^?x!gX=mc{eE~sC{~Bvd?Mxu%|8OLJ zRx=JRHeNPfCXg97I};n588;IU1ma>c;pXE3aj~1Q0y+79Z|I(}e`-j@(Gn60f!6nA zzK_Ke(wH$DJJ5uWkC(}mozs{J$ORb?#5RbDj~!^tV`jnzGT}A*y@|gu^G{95S~@}e z&f}gxLcH>qV5ec`@Q<~>U$D0PC1}|L9i7a+uW2EQ-xu{CQSOf*_Fd*m(Fkd4G>I|M#ZhPcJsH0NR?HnF_P~KC<5{{twQa ziJh&hnd5(F5kZzJ5V9#Ub9530IojEf{SisYobAYf_V(76Ccy8jlf~86^tUa>A3^Q+ zf!?$6e{ig(W{#Hs9Y4L-%RexY{SO=Sf4nleK&EUa9PFk{#ypTkX>7{L$^-=Rfta{V zOu6~E*!b8$Y&^eD>;Gzi{JAoJxl{e)&Fw#)IX+g%_QBYgn~B?))0Bx91i8iY@p3~p zF2-D(APy6DE;i#oZk_+DGxra>x1TZfw{6LP98-S~M!!eeKf>Gk>=B zJNbKn@1+%je{A^pf6qF_AX)VH$+Fz>gX?;Jw;{S!72IR=r?EBFETJ=|HRZDj>YaK~T z$gzpj_w=8O4bsdnN`Jlbx0+A?)MV%4zOQ-j%5R##I?cVK)n6R+*ILNIE#%CY<&Q(- zfAZa5Hgo^GfBZS5|J|1F+56eZJs3YO{>1fTM)xFs;<^Xp$Hkwxe$42e#7|uJVEnlF z6W5O!-IMr<>mH0B7k}dVF{67DKXKiI@#Er8Tt8-XPvR%8doX@n{E6$wjP6PN#B~qG zkBdKX{g}}`iJ!Rc!T53UC$1kex+n1y*F6|NF8;*zV@CHRe&V_Z5gYo0yPh3A{bWh?Zu6rOda$Bgbt z{KRz+#*d3Xas8OlJ&B*V?!owR@h7eyGrA}76W2W$KQ8{n^OOI*l*zJ|rj7V_>DH^@s?JY4dWAunhlGm%wS z0suUz0RaCX0N@e~`Thm~xUd2MTSfo?e<}cgZBQ5pa^{wOCYrs+PtbE{CzsZ`B~ zoOY!x0|kbRk_e~|~9;SDvlcprSv(?*%3(wLH zKO^#RaB*qf;|B)cF?Zp&-Gzad{KDIAnLATj*(sOv0KwNHC&$~- zI7Nq7UR&K~==eTocO>B3yj_LG4U?YhoXP8){ik;M=j)18#(q!gRJu79cj$&=-PVK87JQM~@kPYk z+IvX~KJX@A$D$pOfTL<}7pvOfZ}~W|9`v z@C~k~cE+@j!Fmr)?6=;u_*SZHr5tXA0lY7_{cawCyA7caT2zML!NkB)>8K)?YpU$C z;Ceku!6i>^3!@=a^4?JkTIVRFXe4&pJUcoekdXaMbj$kys+Yzx68iwwO)($1VLnwHtTE+IW#*gl6CZJTI&0M(NPE1NXL7C}Gy zW#J5KioqUjQbnt=9zjs`T3B@kioxCMWPScd@wt&&_9b%RMTX~t+4B^WH+bR(Tn-U2 z=Zi?a=uj8Gm`nlO7=XD5L{WM1;kcNM6;4S}q2jLg#J^q>$I#rW%|n|W7{kR zZ8R5G8;$N?|KWjnWpnpd>etGdIectceT${%S5%78oFXV-mM1F_7%Os8?7Q_dqaei*$!TIQ~ z7mmDc{~X5{L#2Q!VTN#de~O1YMSFS4m#YPa628NMKvIOy1hOofdcI;L)ijI_7BF36 zR*Ui72XfSQfwI}wFE7Dwx)UrGgRT7Ve{~3hHrU1Ut9lv$isK+**|662`G%y&5H7Sn z^$=zNvxf!!#uuk^fR#{?l;CQP(wE^NchVA1&S}^Y#fOWzK4d1h$NUD)LOaB9>62Xx zezE=Eo$ObeZf$QcRJ&9ATB}v0(Y^a)g7__>h8;X5QAW(iw|JW7gSDs8ULRk)qGoJ` z!oLC*8)sj;y)gyl8!m1LSE3lI2yDE-3hJ^$hI9`CAL9RBx7uU?PWa6zH#CrgR=Iaf z1V>SC(Tvol7>8w*G0pZ#*pq_?OUG=liicaS%-QnoffOe5w90V+eWFc|>uX8aBDt7g z1kvsYPH^Bh9$LTXo@)<^XqA-&AUqrDxi~a66_q~r!N*OZ$ggJNrl#Vpq_Z>GZ9@(E zT`f5tJ(ah~ncwCyps7=WFqxemg>Ug6mWvu|dE~(Ed6|*gjUrKu%LERw>>XdOnf>Z; zcLEB4ySpntv`-`)w`%JtNk{4NJSlglMj62vR0yULX!AXpIJOt?SxgWyPF3E3ikH;jhA=VEcihT#r|EmP&=@jaH>0tH^?_Eu(We( z@htgS3Kdiq^?^t8KzOR*!AJqSC0YPZsX4pxJj!{mJUh8xj#qPHECbbt1{#c@sOCMY zh=lhZB!(np4|zEK4#D5&AF18XuCh(zV}!wLW|gDnu*ms{;K9b&811;*vucJGB3yDd zI!9NZGvZKQDipY4QSdx>m9Fti?I7;i_)XsR3%7vjbDA2VkU5WbdE$p^z3T$K-XG?l z5*Ussft9SUGLNiBk=WrFpy7dIuc#Vx!Q4x%LV zEkBl4`#tD^=bDc~Gh?lN!nPX-DTI7N7qq85k@J+O^^H9zwt4bNiVp}v+qUW`2KG{D z;VQCeG2Zx*!AkHm>m~K;#KDwA1%yso$Vsd-&^d}`a|x3_=na*bz>SE2YL5AKDwi&q zD)wlK%EHpN-;xZ@K(_0YKdkveq4@zYRrO9VdBWTtL7kBq;R&?A)>KfS2%fCS5CJo) zQbhlD&H4WFv&_KSGPwS+p73qqH~9M$n-7iWy05+cD(#-NE?3%{5gzO=^rl33hDTqHgUvOx}s8 z5uD7@bUr~SbRG}Wt>Q$GI55SeK z0oyA5A?Nhx)`9A%>%z5XLv0i1rclXcqvyMB_Vu>SSfg3Np5^gW;OJ#Fc3tyCmN7}0HwQTF2T8n4gPb9)@R{@pURDvvwLEMI?5t4 zSix;^xLjgmwsbR%7SLnicD_BkOK%RDTdEg8N|rvbx1ZHi0mMgb1u*jBVHi)v^2Iw8 z=V;sbBHm0;hc|DU^%#Feux-i?+fO>cOJBU9hFXY)pRAvC-puoGK0cT@%|anei*D1= zNOCXaI94^8QsI=&1UY0=U;4fW81zWiZ46FRr3tAv%|xgnH5N89`Z4)~{U=Vvp%5uX zG5OM?wI4i>Jzo>M({@A-+s$aWy}a%-dT;FsC&;~_^A$HZ;F1%7z5D>)+{$Rk|8~%J z1Oer_^@$U85_U12tn}N5gSr{yQ%_mnQ95K{#0m7KKJcBzl^-+`T)KP^xZuXyg}O$a zP?A0o!-9dBswm$dNv0^v%3g7KyO53`u+ZqfnF~ApaW``pZK5c>8)|FCpG! z0;35*?@Gf`OEJX+ujR!QfVbH=_$4FJhm{=I+YJ~XH&Mq(S0OrI5!N#E1*ZBEm)ul7e$lvI9E)s} zz`@8#gBN1EinR?5&$lu>x68yxxR})4^tSb*ge#Z5 zH6fw3*Qb4Fo26@``txdJ(ivkmsKS?#V!0!$+4L?rt&QuB(%4%zS>F$Vd!dVU&yNpS zH->nPp8)E-fH~Z!8JuqLmCwHYzB7ZJLlor}7p@@;)0)c?tf-l-TyGKoEC95Re!$vv zE5|i7+$7|6^b{Iq_}d}RRCGSzZh!Aq{d7h+9qk3+ks}kcXHOzOlbov1DX~Vcaz4wT)}TFps7j$23QwC$d6yINI?IHHa94Y>B?& zPom^nCi4ljmL^YlF^BB6l#^Y{Y60|!jt+$ehGWfI5wZ?~^DI*p0y~&6E#Tu(Yd08u zITJdlF}OAG5UI)L5!+t~S#^mB3@Z3vk4M5OJz)m-ntZ8V5+^=MR(B%J#zVck;u4!y zP^^0sNs&dIF8Y#XpFdYIOs$2&+`-nBJ86|h=gz=z0xEZ({+gwgYO-?UTgU-f$DZtL zl_2HQ3FEE}Tc2KKGk?|ucehKcI*6o{KXwNEmJe#wk+wvTd|olkpDRD<16*c zHf-GGq4f_yj4*GLjxnpQ$}^VtL-UvbOusqhT=hfF#V`5xb7A~%d%2$OR;^})OtbZX zI0)1%W;_Io>!rLe>2HrA8#o1Qf6~g&))es=7wWtRRSqKAsZ%{qq~RI}9kZx*r)IC` z#ucB5-+UX7+Ox}1Af_=-^}`Ua^~ubPKbD<)BB(NSgXM2$3$=>dB55Nzk`e80zs4bM zaAj>X9=QNsrx2LRh0@27CA6`8bTfPmbXQIXCPS&I+LnTAopuu_IrBtp%*18o->@C4 z_$Y;<0$<^#;|$Zj_sjX_eNon+gwXLYGM)#E-RqKeq^odv`#RV`PG2eQ6q+golWVgk ziY2?fJP;Yug?-(&yEIDzKC2o$H;zwZ?%UWyAZaqTo7z|#Mpv_uv+H&4s+2$6A`kqik|fp9iIb=>1gyWAcDk4BOT;v41e#HzdI{1UM7^>|(Dr z_j4-9JLePS;3@J+w3uWOmkRQ<9X(`HF1(M8b}TK0?m3_w^@)<84FLXuxu~ zNa=F%9<_rtJ)5`)j5UfTnPm~_M10FacfqCM5@x;&yrMc$H1p$>7N&cYo zlDAQCQJ+FnIOhdSdj};-!dEWQXi0J0n-=3#djFJ@Bhu}wY9m<%vWjXz#dH3#_TjnE zI5^p>gxW<9b+evfs}Ccu@dw1~MPW=EK$(%7vLI%(j|{X^7N1oxHfKt}FS$jzSEuD) z5Ab@x-AGW@IIKn^Q>a2a2;-A|vjB0jx3-=aMsGCH?*v)x=3Lr)f8QoJz_-ZxlQb|z z6|A>h5(pgujmc2IioAz)We%RRZUHkj&0lH7#-C@X7)y@SViPtj(x1)cB9Mr5(9$yI z%{(M4LZ4@FZb1;N_7PRd4Q0y_uz}MnIb$@8SU$oAwM1!gA-ShKLd_%Lc_x#5Ww5th zc+Es$c|!eaXBUg2SlzP*LE=qo2jn=S)&4Y68c_y@wN5j(VctcvApeqA4%KU1fiv2* zS?+48M<%Y!_w!RyPhNeMl!p>WE=bWOC$<@{w_Pn77AvVcA(Lih=oc$)uw8Ohn07u& z(G!*|N=c#lX&w2rt}Caz>$EuP`+h5NPeJj8Mm@R-PsZzjM7C*!9$ml)>lp#1uRI%(;EsO!qjt{_{A&8(B96rD$viSZsscw#Q{eL2GLc8mvdY^e!FnrIAe3dxTQ%kq|+!* z;7&=3di47GpOabk0$9GG8elLN-t7)bjpsmw7*cE zhFR!+Xjqv+?jm+GVPXDK?=IT+6QpAxShDVGy3ne5PyE!m3MOG2mZ?@^SM&aFqpMw7 z!mzY%FAP%lcMllzzh(!@y}c;2^{)2uV?p#}&X?wfvscA(ki$p|u%$R$(T?|1 zx>OK1Mc|bsh!hnv;DV4^t}V=ZmF&_>`PHuGPApQ{f$LigDmrgYaZy)E!> zyK)(6i4`ATHNQ5dUNEcDDDp0DYr@-ysq6M?9#4TOCO-*Sc!E#Bhq2@HaW9wvGbn|2 zg+wtn&RUg!_W0KR^;i-k5FN4XQ19JMvf8Kh_=YYkNt@4KT+N)YA-8!RT0s4+HGsT^ zo}ube(3{lroa04Hdah?nT9{q+>1d5Bbqn8$-HakP75nikk3pjqa@xnO#W=T%1x${Z ziR+#ZH6&5z$uvPin_QtwkK12ab`$eqUuxI+-gwEdxJzRTe?z^6$?@Pljm?%?8G=<-dq0+?~obEIiqsN7@$rM`B3sZ&_H9z(c zmz5jUMt?3I(p;wv9kYvz!iQD!Vl7i9Fd8+Gn*PbuT%pGWNEX7hx;T@=4E6YIL z*wIb-q$y)`7+PB{uFM+A!1usp&%uKGohZcSkwRb=Q+7E)n=$TL7Uz_HujB?zn?7k~ zzhIgFIB@P1??d4ruOqBxSxe4>$t$K`&G9IdAU-zQp!!Vn6Kk-&1LYPH-cfycs0T$9 zJiiU28W@KQ@1vdFW+$6jmlDRDNR5hA`hWo0w-u)it=)|R@NxR-R+8oiMy!$uM7D8e zGWY8Dc7~>?sms78D%%GLKC(}Fa z-5%Y&*jQ2%wPI0&#Jv}fa*;G1l^k@p55tZ#XZtp`cuz{}nB}P036mq!I=Ayd+Zn55 z5653LPx$ax>LSu{?B7w!n=K5&)qLD6bF3`MukDvTBJ*}WQd&RjDK_TGFNo6D%3P07 zV+%1}4NRZ|zd722~E^Y&CT2jOsi8$z* z)CRZV8_`_UQk(}*0`~Luy$jz_PbLVMefyA$KiH#kK6Ep%;bu8^Kv& zR3+9ukJRd%OW0*;GGEtrFga3tZ_XXIH8(@*@RLuo8Gf8pR&t zW#z`O66pH9DrvINqzargPyLObL1E<0@~QS{<2-E+U6nkriY2 z_Bd%ACEi4$k)$GNuZr}%( zK;~Utmno0sp5@`1M);!rjKauR4*Rjg+d}V>R2sHzd~h2pRL?tu7VZ8h zT|`8hnsTzWHbpKcnxeYao4zCtj(J4;8-a0-jDl@3v175|v(~q+1@EQdB>=4N3AwEqhl~5?29y2N_)tQPpqHgm|)9ax-tN7`R6Fe z;kBi5atmyRlbKME+2gtSB6#-b3on?n`0jn+!0Y;1>CN!K zagQ1{YoB89U~%|CQ!_^+@vc^qMS>5xG~$_+dvffh4o;?$aEVi$3vEDb!EHMC)K zIVL=IE4CE;cN*J3$b-cxHn9u(P0+OQC-{?&A6-5O4iH>=JWg23d)xkkb7tb^)ZjTK zMTJ1qq~x0cmIn0*WudccuUoLsJ)aC%4{x5d>XBOtC?ph#=+3tI1i{!6urBf(qq=cSR-=Eff zK}RQ=#HkiJ56)m?s{e?4p$oLJ9F62dFID1N6~+9t?(a9ejQhkdU$8SGgl<5x)|P!9 z#kTU53K}O;WL1B9G2GXZA!}3Vqz{Y@v2Pdj-qgwlT@m{wp)ksk^*h$X*`4GzKPi=Z z$;)+4r_69<;@68lPSdyfr2e)aMvmSOu|0(%)lP^*nMXr-&N`@C`I!O1T?LI$@gXThGH1OVdZFwRJH4aeabCN^8568^ z7>U|J1@CC5f6|LGp%O|!ljlDf0W@~FSWB-UZ4F|#y4In$Fp_x1$!>1!guYX)U@LWA zI)<+|@ABe0PSIiXE@Gm}N&JQwy3O(O3MHH1ErV~C=N-=lh_kn=ZA@UrhyAefU?}{H zvPMe##uylKOS^KBS`DX{Po!@k%%UI~TGfrnV)n%Tif%{085^ojQZiIGboXq&GAw}% z&bAT;an<}%&T=ZAT43E>+W?Q2o1H!8h*-*u=UI*K@mFZVkU? zZ`S4S3i-o!RW4GMuXn;S7OJrWJ~lQ~@$yZyZ&g6EV09Ewu!?NZdvt?flDOo9`RBIR z%uLFxrfm}qDv0M(9rR%%^%FVlUFL}@+wPnJt;A4q_O+nqjfYQ2WsbS2U(~*4it8wX z5~Z|M;Bi?8RThS0?RIq)B45(XWrgC9Tn&KSD0JhV)QjJVW9B~TIhsWq*n7PaAg7og z;X>;BKI_gkG{?=X9ms)yOqy=@f+KaXM@;Nt0wF45s6DoOUJ`6plqYlPxo?Cd&)i*= z(BQ`MGrcpA7HZ%fehU4m=V(esv?YUkWPpvXnD%oTN<o$C- zNyK3}T1s8gaP8U4af%`4seXi3`MTP8&dVjmh5BhUk)~Mlj17i|X>hUo-$p!$m3h^v zA9!pdzx3Gs{yQ}j;1>-_J{PN>m|SUE65x>DOo^lxodjAeQXq95TnQ-g6p1@xJlx+C zfdSRJO$ABb?pzvS>~w$Nt6~_{ev*p>lRFko{#fg|-g?+0OZ3RkuAs&q^eGo;X`O9I zd~sxZ6B*ZZbNk zrzsY_JyDW?=vg$WD~ zE~0ENUTgtr~4R2oWUr{!-A4`J+`|ZK|Hw-doA1qJUKdKP0)AAIN|vxvp`qHnl2sReJU zNX`VM=RDUN7L&v&a>RckTUrt(aYaIdo=-o+npZE*CzEzM9z5Ghi{1`%WrHn44)HNJ z5dr??4NBA2aH4_?3)}U^3K>VTC1E#IR*RAif+EpD4J{g&2M-^;gikx&?Ur3J#u*uH zcUXdtJJMhJMDyfbGo3@}K<>ssmF&@p-*i0{ndr8lxT22@I?kf7m&7Ay;k636VNDv3 z5>-V!#z%IaUY<$px`5c8?kM(cy~g8-CyN+YT#{wW_%dr{cvVMG7E|K%CFM z)BC!p{aF@;e!SRSZ~MvXMc^HNNb!xf&8A^XmaYEn!;b^qPa$V%5LAq$#jV^jhl?>n zCp)~b>ULt_-fj`&;QJ<1286oa>UVb|F}gAnx_|wW?$R~!6Nl1A(6)V?#}k8X!b3rf z#*QV@R+*7VcTB&heWqJb;Z?Yg_Lh~_2uY0vcH_vRif$-y8ipA0HaVqgq>I9)h)ttR zN3wNUfY!j=2eS`CW})U3NY@|Fb$erWx>0+0>^=^=Z~)wyr~{gxo+ulrUl<7#if+t& zlsLr-d%j+|cl~Wv#K-PV>fsrZ@vV76%EESA^^HuFH2xx@!z1WC1i#B0WV&mvVO3?O zw{aVYyb~#P3-3sXEy}$G2VBFlhTeAgyvKv#6_J^1ki|;aihv4wr&2K1UoR)3(nL%i zvh(F86D9Mh_UGrTQsuJsl5CF7`uio88U7ghYRU5S$}~;Y)>i>LWv(l$RJJ~!AwK>n z49gys(YSu1FEiVVs3C_>LT4NDO|| z${{$rQn)L4yEliSNGgnNho#Ug$C-n*)K+bH6Jq7*{dFFP!tV>WSMkX${!{aXFxlS0 zwqD^3ny|ZDyy=3gtBB~cSlEj>DDa4Ukgkpgn)+au@TDfDrVi^0c>^!p=Ab%J_v#I? z(J@Y)BI>0vv`1?#s5XT9GiR%ur10iA|BCIzqHp)awM1x)*p0R+4d~08p=Qt z6WS4Oz|C0qXmy34QsL$uRUuiR-IJoB%=)Wi$E@pw;g`p|&7ZcbquR|Gm+!OUIYl=y^l<-|1si`{W8$OervWqk*gJicz5Xs}jHkr=yu54q8K zs!!o=%L&GXkeW!xr8~?_XAI0xuO!QvaX8+U`_hCs;_8Lfb;(5D$mh7JlahBib+XQl zXL)e(+%lSx@TC@UP?%^(r(0y&v#FQ`v9m5{sdkC}o;DX(f{*XCI9OZuzI7Wo^B(cQ z9pt=31k_!xe2@Y2V8t1u9)1j zB1*M%hkNwdd@*5YTx3?uU(%~wVze}B$yndMD_D77Sx=WVF93O}3Wlok3y3oM!ZO~% zL&%A5IqWCRmSI^6tNGLrZEwl}lYbwr)Vrzc6>bGDfn5PL^;a59!`!l`E!f5Zq{}Pu zX(w3G+QbZn&k`uFN>E^d*Q4lOMqnotYvOpcNOOL;X$qoxY;SxOO8cP2NPB3Ut#f!WTMm(! znz`=)g}~z#4wvmRN6F)6iCPW(k0)NQvZ^s@g1>_k`4 zf#!DyUN7zE%;i~$2w?1LsnBh)4*PIXBKmmG6m+0rV9_QZ$w z%{inBUFKW<7xvc<&y`jUiEfob=gdX%l9~#V1v^t{7zQFzYjGp@voyJs<3O)9ef^-R zqo+cgw(efMGfJ;h-O?e?ctxVeCAFI0Kb_e;jTI^*J(h@ld z2A{z?lv(?4^kMIgqG0QC&acZMsbe_IX|p7n%h1=5+9;vetmy2^48H)jNe55)uIRCSn?rA7Inf*600#qD5aS>#Sv)joqJioK9`7uFo4`?~_Zrlq zBoI-hG~xZbWB-j36`b7fn*OnqjT-pBXl;Ok(@pN{g*_;;Lwke4eLD8#UO_oENN{By zWC@%Qv18l^?A`d4RSmBGiKvI#Hp(2;u!*uIQMR)WXOU^G3lG!~BCTPJb?%8e$G|#tbg$|;B!ns zNE~PWS731Ys;%;XRt9Od<^k0~MOFcxU^{at?57DosG6o;`fX&yNR{RbGa04lJ6Z9M zTL8NFD1x?IAWP36iKGa+YD(!AVBc z>Z6_Cw*oR1wL7eyVdN8fzR?2*rv)<)xaD#Cp*(|pH@}9a<JsnEKlP7Pa-s*=4Ri7)yeu|$CFtB) zG=&?dz)_^;vu^vTnuP8y;B$wU-`#%a_npj%Sg!Wu0nlq0I5{%vz3c6+H$@BI zW0~$ON_u)U-BPpl)Vwo2-`o<%LJI5v!_>P|u2MD=3Ni^$dz+lPZnnNg<$RpFV5r~r z?8GFt_m+LumSpQ7ij=XNlmzDW-d_Un#R$N0h3OtVRPq`gp3r=PryO1ANxtp8;W5Y_ zJg-aA@o>Cd#qy-ECfeXQw^trU@!RuALI8w6p0D&kAkAh*492E}ppPiy3NXsBP7=(= ze(X^|s#1awf`u65u7FT_D&4Ff&Q0OysBl<{WUw-}=&I*XRV#!3-AWRuUtHIIc%S8c z`Ytrv#b4Y5-u@*X0AsXiMfZ8UJ*Jw&J)tQ0;610kCrwObshs_Mr&v#En!%o9Yimlr zu;N_`I<`F-?n*zYC3Zh!0_b()LgA9SoWS;r_ik(Ie6x58OqIg)9+6d74qH*LQrEWw zj>G@?Ndf<76#b`V;Ydj8#`=7OC91yvVQ`>U=O^|!bWQen;{EgvR>djUK3o?WEqs7& z9g6OxO`obb{&@s$1RzS-$zh8KWo7<;{$H(-CY~AKh@MYytmtq9|w%sqT56bgtq@c)M*=gMoyI}x^c87$i~z28YdARAEfOd z!#9PH*5}f+`SULU`0@-OJAz(V zzq_f$T^3uD>L?T?TS`)S6?-hX*MwF*+$`bvg^u z&YJ>1$Q49qa9nI(xsDUMZw9d_LP8#Brra@fo*{Mg>^xA5fPqQK+1gUHuJ-h3@q3h*xm!us) z+uQ3Bq8Ry1v8&Q`w<3cT^a_V4t3b*+wkRzG%D{;mpvR8XXS`UN(}FI0X03xHk{>`G z0F2Dhlmw4EE}w*70`R>pfVBSnp%gv^?R@x5n-t>x@jPk3x;aK~kX;j*Zk|65=bdQI z?aA-=5a?T&?LGc0!;cEhy9B86EUp=f)%Vu}njh zi0KkH69N(xxfiO@v__U_l1V><`VnJd3=Bh2AL#|Tjs?-81Kd+3`Zn@1_M(}Fb_Cw` z^iSy4coWn<>8XEmdwq)Z;o*22D$qy!#hd-*hsXV?2@*Vz7hB(1pmafxwwI=#pN)22 z_Er5x_wzWBkWYm|Hl+cys(zL+uV_U&iV-&Mm=7K$w$L-4v52yZ%E)Czs(PZ8guevf zo09;`z`fUxho{q3_s}2-h(>z%fM}IAu#ezHRTp##-U7{beTL>Zig=Kd^B7WvksF1cMa}bIth|0${SD zA4)_ z-r%{{aB9unEf_z}N4~3Vlh5^Ca&bETk0%B`nCi=a(c1YhHSx-S<05~^Ir5_e$$z+m z@Jj%`HTa`1qJ2yaO(2fL2oVkyb=xoJ086lMTlvtGn?Uh+fH_eicdzbofLybIECryj zDF7!7oyG)@3mkOe1dACAvfu=d{P}089G~MxO)2VvM|sdJIBi!XbkSrCP#u6YJ%Yp> z6RNPjPCoL!f_etToJXUvz&DeF1b$x3kC;&K)H@)V;V~03;4zT@We5(cXYgFgZ-_PU zj;!|vaBFV-PP%tr&V2ixV`9-I1|PhhwvXTP{U7uCB>?{c2*4>pctXIt`CZ#sRBm&*wUt z>pVRGwo=*NuFT`J=0Kt6b@)Ms3^5`@0rh>YI*t6-`-cINgE$I{UbwOgL{sLYYi8^O zDuEc}A+KN8Si(kK(0Vtv_C!IO*EZi&zHLtFGLjlLZe9ZwH#9wxfx&)1=fj_eoE>|&bl^H9O!&}6*AP>yEyzSwTN zB&k)(qM+&KLxu!b4en1yorVTRgJEz}-xHhSv#ChiiWJ~rj^(E3ds{+H7+W8`vwT_R zJoGuZ;12jK?%%)K0j&1-N=Ul&VW%#zv|!xFka7c@#`C%W)OEPAxCKG1g?$A^u(8cw zsj}Ze<)6su;xBIVlivN)F?=d-{K@%yzy7aC2j_?9^LzagfZyw%%K_YpwUAAtn~yaa zUo;F?AH6P8ri3)C{(jRwh$i57V?@FYNScz%zPwmyCF{MsA?@H;_7_czjab@ww!8y_ z>IcCUt&Tt_8X!h4sCGZEHaWZi-Un>PJNrANnQAnPvFYnDk{~Jp-mWq*D25KaRm^h~JfC&@yUFUOeLanxp3tikLU63M zqqfjGvS9aF;b%_DMm`+V;Y5!}$S))KB>=zIKmW?+iRML67^UtI7)Eppnki{&nr>Pc9? z5Yna+7@~S(1HzDJArX%BDjGu2_9Ovf!}uAx$pi#x!DwIxTA*`ab?;Ze#~$Jtb2i@) znL#kaObAxxeg_VgKSe1ElaPm`bKg>{>s(_?5UXJlH43b4lVBdfc7;RZ{zE1eG&v0PO3#OI|9q0V%a%K^XuAcB-$&mK9yF`rry2E7@SRz0B8ae+;$j4bw5$ z(!@i8y5wMGyfDP8oWJWK0D|@?miY;5D&(DzEbHP;P~4Tj3&V`pcM_lVqB})n7ERQTWTo34qECvE6YgWzGj0EqVlf>UAw%ORs`8+3XHrzFQ)0`2=z zA9en0rtwd>CF9?TKUkrOY9ilX=T62i_LRv#+;})$ho^lPa!|>XRpm4Duii!vH)-@F zEcP(?M1?BwO8~w;4OsB?{g4>*ZwJQR)J`#w(TYiKD*D}4`eR-J1mc&6l-X2iZG<3? zEEfPuzlj+c&((r(J>GQjm<8Pm3>f4+KPdS7 zY&8W{V^Xca7OML9df#wyc-RB0RUCrsuIWlR%a|U#yA{gdol6ksv@3z!BPFwfu=~xgUEPe z_~z$q4FG1CHxZAGEZZ<8AA>X#FUjqjI* zS-%itb(#^wl*oPMgEzu5I-^)$w6tthG>8H+n0Yc(e+)c^ICLje^=A?~l3Pq^>IX2d zwoeH2S~`2FP4T z-TU}6y8_>`LJ-_zNZrlAEQkXj>VNm&2OX1tx=TjLM3{5}R7WtSRWZNF;XsS>74GCB z&De*xEr7wAD8ND=V37_@q?B*|AkdFGpwL&#tzW@Ils+i%9#Mb~Sa`4q-dPey)6egc zukIY(*Xa?}=z0hp(~)k1BQn#t87@CaSRf8>=}dP{Y6p(ZA@b>-bxEvuv7s@DTyX9P}Kn<7AkE)OYXK6!gH=RX@O~ZJO~l#d-;9E zh(nC(w{z;LYckX!DEJ7@58KXZIq#1j56gbMJ&(V#-)QNXbsyYxVk%>C=_;v}p#*kc z7S+kLQm3lC4Ljd2sZ|+{fN+_1B1tA=QPo^scw$c( zkl|SL!fVW!`XvBgoB)Ii%~1bl&+l(#wn(gn)+>_BM)-t+lQd3s-zk@k8m;$Huz1b* zj}@*jBB{NC>yVpx)qqIRu;0gXj}~Dp3)|Jpf-;hq=e6_=snSJLUnOUzA!A5l9* z+QQKrwz$|@ycT6j)@ShIo{3v<2S+1yPE>}eBi>D#rio4oahJ;mPR|A=_sJGNg^081 zUPgbMEh5kyuOD0Y_dAbo_jha+H2Vb($D41i5u)l?L=yqoTHCG?x?z-PJPc6vQ4rnn z@23C{e zz%#)6%>}K{c8n)D(kHJL%wBs!QO1H;MQ;oF0MIHum1MREFFw29J?dN?0@}+H*m5UB zS;h#le+LdM&M-qM#xpb$td>9XDQM<>46B|@M^%&!LjeG{Gv)w~5i5CW-Fz9647H2~ zRBnI+`bd=H*`Pu*BVfgNQ3ghJFO&cX#d^@Rr3xI0DnkrGe>VFd(t<-1KuX{KjZolY zpBoMeAH)LVxp&<5knxNNJWMt|{yRV1-zUFod-Hfk{K3c%w91DgKiGE*QYSp7SyhUZ z_1!jXk#PudHWP*R%9XhUThiS~T5B`+bC(J*zFLa~k5_dzl$$8eE#88x&RAZjtxz7K zlom;{9*VR-_IdvjfGfDw-NTtPS`0uLigPq}S5KwAMA zqufK@5AWdZwD3HUjD(%|9Z&d)dX zT-PZcn5N8CKoz`VXaaE9Z$Iq61mJri0F~n;MrWqqHeQ{K8=iLz&0z3Q;$XVXZHobF z`ne=sIZLGxI!OOJOBQ?i13!sl3F~KL1+pxQptnb0bHI8&nN8rNW52R?1;DKOG1OOJ zQTc25oN9r)hd0FiE;Al_(l8i(ACLy2y=@pLV{tD4l7EhUO!tDoq`5&ni1pd@rM>H3 zS1OshQ!;`vWF(WJ+iVuSJxa(~1939gPyABW3c!nZ1ej*ww z^Syhz@Q6q%WR6CdoDsn{@%|)`fO-twEqj2J?cYbBpZE*wC}ROKaf%?golW9k|_*Ny*;W zpP!4>AlN@m9414Q;)Vz+Z9ysA!aytVj$1fo3=P`%6v7_6gUL*%WJl~!2kSqq`v+-+ z18$3`q0$yF;(`adxD&r&m=6KGy%PN5i^d(snuS zyMg6f;hA`t=Qr<$i2nKaR*;`7xAiY-0SMflcLGSd94%48g70b{r3b%f#XXU#L?e^=X05N?c<# zWS2<}oYldQ)H3eBEd`8G(ZzH%a8=iq=E+(I1u4A`au^qY^;;x)+$v=3+v3+_KFE+3 z@GdHT3BdRE0Ay}{5#GXQVfg_XbaRo|48JWqIZ;xz%CPz1eRH`Ghh*w9@et{fe@P0=Oc&=n`)nYbly8`vjhp--Y1DlW)?PlIX;2WLXX+^#hM!(`eFNP z2101P$-)v@j-_Z?CtUFG9h4~uCRgqNmqDBb!z72b$Up`;WQLYLsY(@$#?JoyOp1|Z zkfmf{qDDy4$E_K{Y}b*Js&go~4O~oz7}-FO5gc~ACw>XQ7sLM>cA7oVbgh1Zr(p_! zJKNil(FK1N7O-`P_k)sj6A^@`1fo!T;BxclV$h~6lxp~s29rsbLnias3YV(<*$1^% zh!qIMR@tkDh=$at$33C+0mQ(t1ySeR_88xwcyg=Nt?ywhnckhuq)6T}v_C>s5v6G& zw$Sr>SZ^Kr{z&M*!M%4X%yOb1Nqy-oP+|~%u@=;1Bxmy;m^QH&!EqxKL=+UUbP>Yd zmc{q?@mWgE$m+B1e@BhS;r->mr~SX#CJx*E=-dwHlYU&DBpvnzGXle#{nhip0=k?k zH_G~TMlRacN%Wk7cG>~`=cDgR3VD_*f4S4G@H!znqiL1E(8_L-0!>mR!e|{rc(@*0 ziFF?paIN?J5`b?`0>)SiWT&I1PJLQyv4{|u6|c9ZItOAu0yCZ}w|5iVu0suzrn0eX zLxSAF+a2=B`IKI4GP7~>J6T9MN0b$z(?I3(p(--DW*C%^pvV(1t77rDmNL`=fjBhd4x&z>oPXvFSc1zEY>Zxpk+3EB zo&*Qs$7THjws3!=9J-FxG8#1a8;>hbB=461d~FB7hN|cuNheql5hNRpe-?wCkb6qw zH8-38UU6romr1j?vY-bA$`DwI{rR|6pCW0y8UIO9@>RLgjV!H#5C%I}5vp7`mh&9A z_b2h3p)DQ@m*1e=?o|uIE)w;1#!v8My*k(c0%TU z2sT=nXw(Cn+5B)$g)gnPi+m_w^q6og^Tf#!+H*Zc?V|sGswTTi_aBMKA0iQ-?Ej6C#{t;P(Ih~xD(af-JAEGh96peBV-nh++ zpuOJtb2hD(f*zzUK+A{;X)0~s(4f2!Z~p;mMt#U!U1a0_#FST`Hd9+ zoRcG8yO|B&q7 z7UTwZ|9fDYBfa&d$8%L*;snl>dwjT!e>AXvx<5^#&dP$H9G5bAKFk)PlJ_=BrVP%a zP*AcUn__Bw9TL$_Zk*5w**0Ya>Yf+e$wUfuQF;MY3e#yS{V0gR#SG4AuoC9I@XY3^#}9#fk^NBY_G;hbIo zFqS;6BHQZT;qi?)ppm_EJ@zGs40gWb>rC(*3GFI6eo5hdOD#5FN zUy4A_B4=Wc{!O-if=8|(uy2lC^~|xw5sj2GO(0<4FICW=R>F8wxxcOOKXYp-z+bM! zCVHKLf3TAO1ZluOkgfoy{(`oFMg*a9@3NWLLqxhD#OO{k8v~)!_8T37qSGCN8l4Y* z8teXj(f6OPaU#x@@euP6dIqMP!~4d==5kG5_$+jn~{1nT=lU?@zv4eV@4 z=mN>;W-(`phPBn1##H6QJtDZze!!+U=qO#C4NWDxH5P(|S5#x~MWq-4RL!cINNwf zGU!@rT=4Aerg4V&{=q}(oOTDmaQxJ#6-7i?&aIjpK}YfUYJ(9M_oL3nUOAgT~` z_&P5Fr0)7l0KPZ_xS-3WR@B;TN^`nOSl!7tlF#}RyqwSpfcnt*pekASW+M>3_QfG_ zYa3|t67eXlMGyrCh@wK045zW+sfm|J!*uE>FyfKc0lB9D22Jcszivb0Q_~+Zb_wEH z?s>;)wJQ&|5O(fF>~0@yc%3TyI|&&ygbb^u5V+eHDLu@o86IVE_G{|YGEUU)V+(RV z0wV^LJmgr(%}mt5<58=90ZG_4X>^Z8O@sj~;_{}h?Z|AW+8L)xt4WFKwow9qN2nXc zu=Q;9YT~tlH>pfMhH^B-y?5z?24$2acm945NK<$}JPcMA52D*ZcG!px@4vq$<~ zh*j15Pe#^6b{A_rR?{rd(W*CrTb_?raC(%htG3zEv}E7AJ!ZK}^t!I@BqcBE`7sts z_e%i2yak~DrUa3Mdx}hJ!=Vys)+T@4Zg+L=zT~K=i%^QQjW2d)KD3T=^8;L@CrK`? zxY1FsS9l6Av5cTZAr;|Ryxzeoi>8tfn05F|1{em3SMC~0Kd}g{thR!hABnQCEu5@@ zjx`YxlIf@SF8Q8t;T1YW2&)+fKLqpvN%R5gd1pI|g+(|V^gWGG=~Jod6C#F$)#Vwb z_2go0uDDmoY#q5OqBzl=8uO)SYbHTT#z4AA*yrM;t;)Ao>jN%YVM8Y$-w2~3C)-#2i%#V~Sp)yZkjR05V zgUPv^oSa0lf-R8!Jo%%k91PeRKG)x00`Ro}z$O7Ep|qQjrgPr>V6PFra?=I%-2G-x zmA#z#E~*Pv2K)5f#4RcbChzXz|Awu&xk-PK+_!I(F8Mg4v2N{1Nx5Z$9j*)N4(HwsX*Q%+?SL2D8~Sp(v@iAp(G@3ngq_wQeS@6E%8 zX!~p8SHy_onHTa)0KOOjSWv$R@hFU>3vEahmr>F2m2Kvsy5k!F#tdAWZ}cs9R!x&2#|lX}p%Xm+n8LYFJ2pLWE5^7WHKGuPKOW-#n)) zR?7o|I%q||wGLL*1lYYZY+gD8IaCD>xEI}QQ7s%gx?$LryY@Yk<0?_ry4L34mkoFy zcGtF=fd=-&ngob9vABTxe*FD;*VUzdzHh5UIX93UEvmNxe-B2KPzhZ~|zuj9hck;gZAcm}EwQgi3;%P4Xm391g(D14Yn`P}g$_-{%hj_+|>g9e`1q zdg-l#<&+j7*0v-IDW5|=E*nft+T(@YlR^Z)#o*@PJyddb!q(aJ^D_;yukJpHH2)0< z`H%^A;$gu1TH`q6=*Q$nDu0s#c+9c8sXT`${Yk#0Ln^*KiLfgE5i#!m`z8owQ@tL# zzLNt$;v_GyU_>1R?+8KI91I#i+VEhS#4$)k(pM~=im;m%yMhOLn`LQ5%zLJ+uxiq> z7v*~@!@Hs_xzwTLckc^Rmc$t{=OiXK|76{kr+#_c8i2HNR8jFD;v?>t``(2>^M|%j zb6p~8QqEfX(Y0G*2bLu)1#8=h7$rMW#v*bCwR_}VrUX{JH`xX|QAg+JnEgt+?fJo$ zO$Ni|Mg55Ex~ccE%*LiL5vuVTq^*$BKI7|BlKH5<8higJeoAnqQ*4e2g0$WuBmVwN z0KPi|SmN!D_2otf=4^fN-1!UwTV*c@c0~^Hj;~b(8eS~T&=a|htKf~c4}$Zts?Q+n zQqkO5E^%Cyqx61XZ39!qTba!e=I|CkvSzF>(}x6pK=i(>hkOS!+#CR2xh7ge3&m^Z zo`h?WGPgg{A9jRTJ+DQPD$BG~VC1?_AeGawChgd0QQGh%k7nkss58cLYh1bl)Bc&~ z^yvzUfKcvHQx=?pw;qB;p7!^*gC2AWB8O5<^0g>mI6&*44E#U6FM5c({amGf^vC2v zI!!|KB=1_#t_J!)sv6hP^QY6PF!NjFL6ZOJ1*u+G81Fo@)KP(PjfCAwr=iwlh}gziET+$bCi_6lYvQaXn))lSp>z>fp) z?JWRi@_U7;0zRB_7Dg#@H@Lvny*B4Ex)GLL=6XWF(E2i$fr5`ot5t$4)7|rLmEASs#n6J5k|4AT zcN9?|O7eJ79G*BfWFu-+?g73tn7Asm;3|Tc{!FU?Gq5+|b1cCsk~9XdL$LPAP=OdB z>5&~Q8=nlkl>+XbEuVJ8LvC>D#aHC)JqsVr5d2>e778zrEpc`rzZ}7_k)OtI{7l54 zKlYav#@~nZ{$45iz#<0CUiOHPHlYSvy!=Ihr3tYe?ehK}@3GSukz@L1U?thBpO396 zv061_cHro_Nk-}TT8}NhHpad2jo!T!LbtHiNNZ7!r5i@5Rqm>sWWVJb9o3u)Q1#V$ z9{le`n?Vq-XeTM-=LY!Y9Dp@r9kr_Shc?3$k;^&nnxti_}$g06AGOvp^Ba30lUL@EV?o>*0-?e>ZYJR1SK@$*bmiczS#26tXEKx;a_}_50e$k<~s+UZx@Dx|A z$67|Z!Nk`%wiBc)vAK`s7XiyLF8W9dq2n-&? z!RhpXT?uq0h1SXdSLr~{p};vQ6Je@F;`Q$eR!~K)!rN9$5_2D-+6Nm`fQhgbZxdO! zIvxS7Pt*o>4%ROL_}UHtG$UjiSq$qXl1R^zy$v#^4yn+){$X0*FAIubbHj`LwaH=J zlizK3*uJr$Vy=F3Gh0&}Ifv9Jxz342g(v}$r6(dMF@YCfS^$fW06WzMi7R15;EI89 zv(B+*f;YS+NU#YUpL|xdG#;~2TVE)iOB#qOnZ!pWjQ7m?C(aBw}538TR8UiDry z+dh#2?|xh^S^|(xI1kvx{@phFUL!ZGQkvbUp?e)r0C-_|Slj0+1JWH#>)&Ou0ks$x z8zsylb*#i5+IB;@;~rn4_Db0d2%2k3(Anb3yK-A&d*;93_|dSEc&~3awglxyNZms6 z$5;^V9$i(&{k%s;>jebksI=a*Sz=D>eCGifl}#+btViY)FjE_ zE|@lLq-f?@Hwn-~gF^ge4yU4c$yT2!4v8a`+0AN@I1Q!Kst!P)Y!Lna1XcGAdaw?G zFTAzCk3?N;)8O6&-7DJ}arIyUQW@S!D;Uz{S?_`PyQmnVU$dVWY*a;_T>8?~6+1w{ zNq@MvT?}pbciFhi?KhUso{)&Q90=B$$S~qva~u!Hpvy?g$mYrtOu!1B8n0XVT77WD z-Dk(t)+eXDBqh;75Bp$Ktlh%o$&-R;QQdR}Vhq+R3C9sv+y7dJa98JX-N!wX7UHoi z!Bh6W;L+%$Z4S+>2DL#%b+pI%DQl)>Z#T;WPtIIdh7+Vf7THK$DP z6{t$JT{TbVnj#1kW|OPuaE03VVvHCVYK+8+OG8}=;YLRcS+1;X=;BTZe%`DltoBMC zuxhZGL0IFyiTGBEjRu;SGi=uPU*=EHp04O9q`J58aAxJ3j$QT30-c)&F{qWnX6uP1 z)C%D3h+2Q2MG5|==kb&6m*1hHV*~2Rfe%01?dOS@h*Kuiwje&Jdf!&X8-*J*$>YRA z$gKP*Rrn^p(ge$b#FY)-bk^=$2NEo+nfk^ZR@-e#a|@11qExJqI!Bv*-)7Cu%Bg62 zQ-gI-3@^%Q$^{CSEBQpcIIMFfnt(Ub@k;={Ir!5^iA$HrSQ|R`r#(WrD`u(? zv$3H~m5h~ze6eH2@?+V#=3t?WK^3=3Uh3$f+XkDZru48qbis5HwEwmOZ*Da@uz^uj z10O*yvf2{Qhjj)t?rTTjj$@F%veg7?ltfFDLz&wDC9i})3l+|3plaaS%7)M6$=stE0VjSa(@41PlSNjd@*GEKONRLI+*vFV^iyrt*k5jf!@ znO`;o>s<|YFyDiwC=LcLv@U_s?o(9<=o7*2->T!6yCo7V^A%B@7C15XedruD`jxR4 z2J(mLmjHY@2Ot|!AL%negOmFKBsD5Cp_;Xf zUQp9L+3~O$qSmV2VP-le`(U!x0PNbNAtoAYRfBE3Dx2-Z2$dBb8;TUNAF&M~`%lq3 zaSii95Nz_~0N8C@lGK z_5tlH^uA)p&<7I(*)|$yK;Dj%Aw&=-_IKeddAZ{D+;(I(n&U^)?npMdk|_qJCvzT!I3VqS5)Z6bUNF4xEpY(S!Yxc79nwOsJ#vJjKtTdQ)IS|&7R>wb?^(thtK*wolV(xO&dN1=0w6=VZWiRv zr*=8?a|@Woo<&dFt^n4yzigZb*Y{$G)riK0(oi6XLMB?JLa(!juTy{`Ho1|qYdve1 z2=cr>H*v9)=Y4G1%^l3ai}+73OCl~KdHdk!8VQ6@17W>mnijzp<k;G)Z;9w7a#+=x~21IhqKhAcYZ z(w$Ni5u_BQGbJUqIpJpzi`B#11%a#XnA@1P6y|2RNNXwBR!y74HODJ>`Oj zmH`^rA17#^_JvCL?zfA>zM2t*w<>*kXpJ1&{H@insWjt|I4c`|tm(WZ;4=}Wu`Qwp zKi5{(3=&42&s18qJc5jVT#lQHkWysuMBUxWTgh4)xju<-OxIy82^RR7uV@0T>scSf zZ+V@=RyADLjYWMDVxA`Ih{H(B;S*Xz+GxK7;9C&@45~aROHH-a1+(~-13Gdd2zAk5il zf0>J+ozs<%784RO2ayBmVk<;CV2C+3v599trkV{#ZG1!h4zSb!4@~+`Bm%wjb+8fs z*F4*O1E5ngEJVL2*560xXncz!0vWBw1MqwvytcSy_0-CiusUYs81M{>(ot1l8{Qoei4mt%H!0<%nP{m98RBl79u=H)SP^y3epGElSl^6mv^(TGbqDwKU|q zl6;>crtjaj??VyYF(Ih}&giNCrk>oLpR{OPov=CPP>!)&AGiXwkG0?X8N>S5>4|=X zd!4bMe+RnZd;M+ZD?r%z8-f)TCZMaavfE6^u@qqFFBv8Sj@f?F56%`&VN3ma*G zJtv;?$FT3G=o@L#HOb(=1mLS%07Ff7SPC|Yxz9I!a=)t)ZONwRpA(b|nGt4_q455* zHrYjOZt7+)7#(D0LuMN?Qpl)9Y54DBC=Bc%+>ZlW?rDcK0!;F3{^VMuX8qgBbdNVI zg+1)CHC;XOu9SxY0m;hjXmg5C@=tAMjjxcYKz=vcFTp zf`&JfcxYLii^zU|2q6KIOIRI|AOy2sFV*>0@?}cvC#;jUneM%fG8_72xMK*BYY|Fr zB_ve1GX$eP4{oY1g0n3UNskxtxI!(i_o~L+CO)s8!U!8f{v`n4+5%vf`m(Oo^l@q3 z=djfyRSbs$)vWN-0~a;ov&@^1cG@5d&Xp?i0~PBL{zBAvmqyxZn~Verr_8N2CM#)d z{U-I!k_hbpo2!Ap&jn*_6CjxlJ6AV;BspcM7R zwpPnbxVf2B)=K=$eeTlH;N~XvLdEV?`$K?wtS`NQEU*A22@OCphAA;}oFG)HFu`N9 z=SBEwAD@W-L|-M#woI!K2j#%-Gu?JKh6RPK>9agzFvLC1=h&^qW+}KQ_*tlsU{#L; z^v`BsgJfr;&JWW4g>gRxP_zt7Z(<0`zth8bIc_?1!xXq&yqX-Fv^bwXkOODj+7qBP zbKlF_Is=gaKyvJn4J*J#@i;K9bx|JMw23Pa zDKOPdFX~w1n*W!of2jWJaz&fS#vUh3uIz_H`Ki|$wH*VwPrNEif@>d!$KeJlDUzu0 z#&=G)#bi$8q2itQ)o7Je*S*tJfTb#gO$0PQM+ZlD+v@g(*4MMI7jgc36`VPYrulhv zt&`L7qT3!0|J(l;P?Mq}Tic{VC?q}pZr)GcqlG1KymjVZhTQlH>|G z)eK0ih?A7x0=8J^miDF4p+XkEq}tk$TuqHSfq=1so_HrToP{Wp6l`rAg%G$A25z9< zaP!y+%!vT~(#;=5ozX>dMk5$>f?D}nX>q(0q_vOn>Sb2pG00Xnb;6c*YU`-bOvS|^ z6ld}%4=0_55L>HEOpiVkCuf5t#yHynf27p+;oqK?^LMIz&tc%NqJw{J8yWvn4r9Ar z-^ZAl-C#`*CJ+w+j|8P0kh%CdJ+t#&!ZYSb8{fkt2rX%nxg^$;C>HKDbmhdPl7w*= zM`I}IIPYf{QP7&wqf2$z3>hCai*y*;C!igKBa#Cp5m8f!V6wqixHdtq4V%uMH7~pP2!P0d$Rib!~teUu(_Xmtc!_(8BYu>6t;gByVK5X zuz&@PdY@hoM;!b*a2lP|YFI51S_l@|F)R>Ate`jtcyV|9re(2$kLhjtB?Bsf+>a?y46ldz^4dy`$=l5=;hrgpPfO>z~r(!Imq(_j^A(zXafG695fTkN}J#XvL0m&U?*9 z0HikHNQ9ZeWTSZb29AHQNqQi< z^)|q)BT!4SW~Tq2f%DxyxY^%detqa+(4FTZ-vb93+easa_NUJ~>i(s z!yb;zh_nDrDHJK`2%R8sK0vtr@mLV8>hDw15$6#@gt-;cXNI%n>96u{*eKUSgp&QC z8o}g4NGM}!5t5jdv<6)o%pGj~dF>zlwWUl%)`vOD%4QmxiVZ#>JlZTVmUPLfSd7`+? zWyrOzK!%-=n-?`GE@bRU1TQ#t%W=2M2F5P|_+A7cdO0(M%IGruMzx~2vC$kmEMSL7 zWV$H|>9U6!#>o75qw-P~;$enD;T3;1eo1#f;QdaS+u19ZIlBm^)Mc}b0d}sb36ZFN zkKHo?h9LlkEHrZd%!$~+9+lhX#6OcR59;qqul@EjPiqpcd;s*{g}$edJrU7*(m-UI zql{4&=aFeI43Q06ZVZ zxn6zu8GKZgezL81zk{3pOwlMrNui3z*U9jQ?XMO*Q^-X zu`Krc6Lo-SCJv%%DAoQAu`jD&`|R4jsokxL;dShnEBTq2f66q&*w<@}9dMK}wMjW< zwuTWx8gz#`bR$to;y^|FGnWC5G>s@)gUFq7g_*P{>S*d77h+u+Yz?5Trdv^1$;y>) z0LdR!4)2v9jOq4rCj)fP0fJT}+a^R1=}cQV4w*kq3Fv&i=Cd8tZy;2^T}R1G1@Mub z4{N<0T6aghH;wb!oD{bX+IGf=ErizlVC=s2RzMu2O>lcmaQiGwZkWDguqK>VrbG{aMgD$w>?3M8nps z!s@lfB`8bZDpwi^8IND@1A2Gv>E4l4wTt!uW%wEE0Sp^oVfjk|TfqTvC3R z2_X(?E$r(`f+8RZ;&{RTaZdph$=7yuv?=tZ?K-q#&Jc}uhVle~DWnd=>WTDOq1O$o zhDfQ}h^SN}F{il{_2Ao%_K#v7-+YG3e{d2Z_lt7}QoS+w{KlUx;~F~7iH8c>si|me za7&76YJ4~}&2d7S4lSeh*kFo`QB@V60EuJ&7@*(;5gS@?b?_9=L#yEM8Zq4f9lUgR z5%iiIeym}dP;W34zE+PH+Yw1boy@`c!n!tzZW66YRNWS8PgQ`nekS-#?Cjb`(P|0& z5`Zs80Nep0LxTiY(78rOFyrVBDiMWynEM#M4a9p#y%WjKomO>+p4Cjp&0dOF7&+Tci&vfYr$rSNOPkM!7 zyBeXm{OBvzmaIV%swr-HO;Rx$t{iIze}AK1|7sUb5wZL^fLhIKuzu zN33RTXr0s#6?a4AY}fd#(fOoL5FQv)e?CI;4H@uR?*OfU5RM^M+h{mkKmJZI946vQ zKKHemC|GWfkvUR2Zhi|pTyAc_#wXV?Eq+rBcKKu0G_fLP3ZQqP={uRU) zcySVFJU6=$UmlIs+1|ZvhV~cXS7qI?T9SM8md9|nF&v1>rOfD`4!}1f0JkKs_gGEC zhWew`nrq#pFvF5Ud4^f#YKFR8;6nEWidVcncP&IllXTd=y`M~QuZvifF>2ENN0S7o zSqtO1odq%nq(Qy~Q*DtG07^6FB9I&2)QZRqL&!;G!rjFvM=JbgUf&cMccPLvaz2(9 zLUc-Rf|n1we^L>aRISGJd1s!6^mbA76^RJR(23QGhf#qn-zmn3fwKTx+Gshtplepb zoeghE;tmy88UW(=EDrl>g@kZEPC37>bsXn&+Ru$$9~YcCfe7{S)pOw~04Bc`C)3_O z4}>u4O^Y&exXGnz8dlu_ZQ2GVf3-e}wu1NKOr{qD&C~#FJP#zNjYc)l&k>FLAe!Sw znd;dBtT;Mj{_KGN0}z0;{%=x12UWjI_Ep3|GOj@FZQ?xE6f~>ua8@8T%Rly*+KdQS z(lH=KvbSFdiG7=Cfm_n%7e^r@uKPj1VrRgPBFwSA4et|6d-;e%d+aOWqV4523(1Tn zo-u`I^g(8z!}aed@UfmaT!vPe)EO3_nN;^YnMAANkZp_ku~6(kI&P*A`IHu}LCh5?Ye4U3-Sx3}{yb~B-~DJpNsgvFcJ@z} z#IW{2nFl}Zr;#HVJV~*Hixk=EN9*lcj-6BjYU{j>ZZK{>lti!+-!=6_ z*v&P_;V^g{_vSp^vhO)tyW>vsV-O;sN&LKQDRU#Zmy#Ec=$8O|Ee9aHLs>@W(webJ zcb>rgaC_U3ymUSUD%;{!QZL4$pSi3}L}2{6$IhbIs!Cw%Gz+>`-mxULDFT5Jbgc#YF~U-aGgI0uaKUgA zn%=jmJhqC?1+}RE#*-DUCk$Z%FL|)19b@?^?5~;HW+u6+)~)QIsc2J?QEn`MvpFY@ zG#RFe?`m;&FJyGd#X;TbK>l-R{&*gTKE#^f2w47)N+5Kv3qptBreJMSrPD0%n=kc- z1iBvke2T|8kpd3;)u|t#_SnmjduEmS&~!rK#URXQfW@_19|({L6OaE!`*Sop28Ane zKQF%o;Cmqe=>b;+pCxdiGO;upD^+l6?_4$dMu{55)F+~tpYLuMY@0*p?XkzaQhLxS zQ1Y&hM}bq-P0SSQ*2Ngo0@>FjNOl%7gPb;>{5r+a^lR@xGya57&4+bP=wX#gq@iz> zHtJBk7tv9*oBh#eMI;FAyl8=OtFNl}u`8rn{@VqXB`s};L7ph)?wW>(rdpQuZj1tf zhlvB_p<;*Svdm!_o|pALHQI-dgSBvI65GY!?5fFd$?tl(TJuEf&V=p9uS>@HciGqm zqv8MXH5s^l04T{?BM@oorFUOEQb!YEN$;Fu8r;a|u{gHRz4-&XuO37!PU(YhQz_Uj zh?~dYfD}(w%5>1Vc}*zXBtW+{ zR_hHZ*-?k|_Es9Xj4&H7_s0`gXyXo2e zE9U}}!aZHo+S9IW3LzJmzDARsxUyz#`WM&GE;B~rc=A3nYkB+g-9zU)5M^EMo&7d? zkkN1sP|*&R1E@sLpANuR0|48V%0*Pf$S15PkMbPEC2)N*5^h7rd*fxyaE{19O=DCa zh8+UE${~x_=#}62_bMGc-4HDYpbSOyuIK?ys9CKVDM6&^l{Cpy1v6g<72gt52E}Bxlz99t>@GD-6cQKpFdX5KjIqW4zxOY0;IP8=Jdeo(Z71= zA|-tb;am=rB>7~l8C3=3r*1&9Y0o^(5oJ0j*yJj1m(J;UnB)rpGt-LwY`p-0TU%hf zGytx9htOX zxUZXbipg9s_!<=&P0O~E#|ZBmF~doFub_2Bs^x4kK5}qAeTqflvM1KULPP%H3P${&~A)95kL7VHMfC&4+nHvJ$P*?V1`=!1>BuF4%M zX|CVly>{K}Bltp-#qj1vkspGIf-UWYL2U_;KfsdScIU@?edTF{d%|bL&kgX)Uqkxq zDNJQ;6kR~!Rplho(NmrzkDK-orjksJ;1aRm)Uw>$J?9ncc|(NDs`T zG6_M8O6KM+taeIlf+O>Abrzca?pI3mg4_P!hSCg%_OdGb9&yP9PWEo40jw*al{7uD&vUr z_9c@Cd4|}~>?=hExi&??QozEL>LO(Jz1l{WwWu8(>)57!@ZdUEJjkPo9&z%njdo7{ z@$U`cs-2UA+R?Q8L6Hm63}G&o{p~hwdKRm#022sGk;kE)SlS{>hC|VV6Nxa_tXOr!8ZcZWIclSfKd%-* zGA5YCX^dMCeR-P3TJvr*`k%SI0)|Um7{KIsi`z|Yeb^|6micm1HEn{@FO>#BLGekLErtY6D_>o5!P3waK`KiGOBSBFTl8#fo0)W%A|C+Ul18d^G|vBxpve z=GBCqG9>|BRdNDlvMNb0I|IeebjhvKLo2aBj50zT3T1Ac0_xnJ9z?7@{D$`w;7GIo z+ydEV7xE$p2|&8am)i`+zo4Yzc(}V zcFG_>!-ml^5bJSt$;?Ab;%)gEcI@ju$um)JjsZp$)$z@q#DM%5vID-Nw%j@*-_r6!D1gnx}kSqu&_dR|5c4?LxA|H9u_*t}6*>R=7e|56=%MJOqjIrVS&3s1vAoCNRzd(kw#9sND4RQcoOpI@-IZSU-tbD zRAV9sd>9cJhi#VQJ>`TOi}W7`8o0by{%i5%*vp%An z5{(M=cp}A9Lt17K_cp*ZJ(&xgiQ!`mTg8YML9S+OUbH1syJ?MFuy9OiV3KWK2Q~1V z`%nvq#{gMU;AyO{MG)eHT{eNK?8~cVJXi2i;APi}3zT|?u#CS>hQqn+k@cULyaVFiSU#uhW`&>B_NPLYNl2(Z zNO;(`X`&OIMnOR~9Aj}b{|yerXkQ0I)-RDI_I5*5PD6kH{Stt$eI@?f@|HUY%`g8# z^R#Dm(?cRI5>>hEhFHNZM~Df|Ex?oH%b6s(yDTPi5&;>`N+J}o4J%e(f7t`Cd}XMJ z5V6)*d*WuUt_SJJE65_vn~a>~>-w=iz^l3)aS;gtIkgvd5_aM5HwR!?#IT={kE?dx zI{Sr8pSy)K!YcJp_QN2V<6z0-MKDV124D#XEwCqC20EKg0|<5uHxxd%{!_D=9I5mE z)8aH>{s05@1?wZo0Ttc+uxWMdYMqnf zEsP>bcqfqH>4pG|6#|+*Cm=5mfBTh00`?oJ=jDk7ko2tcTs5Vp4YQ76?BpWMNK#e{FRwZbXXbf%hjSiu`K0O0SRC6M;1+1UUCCbptU9xr}wHZqx9yX7+KWffDE9mtdV_^?%NR%>Fh z(8wET?|UCNT6t*7L|Ufx9v0oai)w*A9wOr_-+Ji)42M&n;Qxcf!ZG+ZrF<*tkX74> zXW2pOl=yToL!2!Y^zxQYwywFX2mIQfdUFg4N*hHOH@c|g zzj<-jV>2|_n0VYJXwBaKxJjzRT9boN)fW&7k!mhQ#US)*ZaW)(6I~#LIrs&s8^V(! zp6SxEEcLBe5C`Gc0{G?xApXP^e>UqjcV(2u#(l}r!WObDbEN`J zrgh>Pa}b>-%eXxI&VvRyRr*O|F~?S?+2US#@jz)ezS|f~Xrbr0waadcQ}U=h?l; z8W|JINVzQHFzVj2jYdP^-awNDk6b{q9G^kvEWCHEk`169)obt>1r;@I0Ph0`Rr3D-aofw4WV3o6fBEJ#IGjt5c>XY~LixvpE2CfMuL5}9@X?{NmWjuF2z1%Qy-&iCrEQT-qLO}(IFi(Zjve$a1j=!%?}65; zq(p1-N-}j~XjbY-x}G3BY@ZvO^sLA3E{2k|13(1lP}^(p+<)$>of}&qqoOitG!v}c zL3JmoOfsB?K1|0R(wf_k-^BKUMsIgPBNE9;*|}&Aq}>NMmnS!&8$T)FZ*BqnZIJ*a z@KL6|N9S^pOL!Gc_GbqP=}=X?pUY}HT*vbo$zEDPuYg$0CS1CA8yBrnFhGU}7kVKN z_%63E$-E(nMv~N}jGM7ta`Kp6u9gN@f|w|TvFfk*+somMgn;&(vs*Gxs4t1QL!dWO zaEV?JX1eXYwAAx1yUdnBni{2PTdMC-=-gr}jHaDYT|gf z4K${osGncQlVxA4HIUt?rlJSsd8e`8jU=Fqnks^)Ho@~d`6U2fivWzc;*SKG)w{L1 zb#d#Ho0WUxb=E#*G*3tPe0&gLJ^^85xj_3crgZEf!J5^(mq5_1z9qdYA5)CY6;QLE z)ZQ$Dnjs}a9jxy*g?*p9mu?3*hWj31-9R}RwD%XZXuvm7VD4`@ z^vz?4?J1BlTo>EBAX$+w;+i5l1m6!qU1O1Nd0n2CyI@2z%w)(c`o=;Iha{*|lzfc4 zp_5blBI|QE_?nTmaK1jDw~hDswE({P^(XR90Me?Vu&VYVB^o8|3uS8)RYVJTLy|;VSy6ynV=00;w@rgbO zk}VGWAt~VKwTA`?iV-r;e-BcRQwf5dja4eWpJvH---o!?-!r-qf14H&w9*wXapa( zhX>MPXUh1&@t=O#X;Qelp$6+H2M)W3r2#o=;&K$p2yYFb>i9<)KGc>)bo%*KwJ-`& zVH*FizPiuw%11=TN%x;#^A>#n4ZuDLoe+j@BBLIKmnqNjilIM8Whti0 z5na?m5n1835=312=hbf>V_zSTWz&tiU}%LZ$%N%g(aCmG-*BQO!=kg#e0w!pX0&nY zZJWgINja`Fo(UDc88&s%1&8G>Epn-Ro?0dfJZtyj4m4A+wI74U2NroPPw^kH*6XzR z&y2!nXui{DI<+a@{=VG*{e(ou`$>f3x$@h`pNPNzee2IhO=8Nr!jJ<_&X^H8FAMd} z$gch65R1)9vdy_eSQE*cFa;Bb{UK*5V(h@1!4S#N@mLodBm4DD?uCT`2xFDki49ko z@d)Ue&hz@|0DN%*fbkLoA{dl4{8oPoRpj=9LiVuvd!OrPWB}sS3K1p|jv4b2Xi`C$ zRU{S^Ot3+LpSKqPlwsh#hpVx5= z*3xHk8n)GFXrM!Eav-~wEpm>J%O$agF@#tN(;-*g|E*82@HQoG3!coSdWa4#zj-5b zbZvbE(d~e`v0MrI$=Zl#1 zL+275`*AF-2YOUhWxB0Kt>tiv+s!e}{fv`@Lw8(l1znGM$v!{%9V4p>AfCR2>@k$? z%W^G{E_3c+6?duZ#yR5TWZ6S8h zUZ^boC9TUaIR`X;j9@}MVJdl97tPtv-SW7Q2?c?3S;M}O-N=V~dClXy$q8k|7bO9c z@F!@8keD_DxtONRYcbuv>>Rvbdrc`|ATY2M{Z`U3_PFN6Cm7m~&GH4OSYRjnu>(Al zF9*aV&kb{UexSN7ri%FpV>oZML&_M8X*QNf6YYchn@ckw+iE+RY0Z291G>$p*25?7J+AZJvA=DF=ofb!nLAvc zY3{R?Kc}_?dHN>bV}#ialQHL=rD9o=;qR4u2nV1UgBTD%k`vRlK91PM!FrY>VhoaC z_qqMeGmuI@+3D2K(LpH2^723dEM99&iqAos>~CEkv9(%Of{|jZ#{c_E0KW8<@hAQs ze`@v!m-6XQS?;!nQ3KzVR?CrRPV;}ltx#Mo+ zQ(SrsIPo}QcM>1!Mj5qIkGF(CF9rs*byC_WIFM!e+Kk}?{|3R`Rk_&_x{CBf=+x75 zH1K;GSVLsiRWYnsMGw^|-O2WnSgBv5}3oC5aprCzjn~cROCMO|R6-eIEPYUoerzHMp-#X(P|~uc?e}f`lTO*|d}WJ}3D7m1t#yAlL*Z#_Zi>`7U?Gwp=^Fi*RMG(8+#kn2 zOp|Fv&wM?4AiSX(lwN9_6S$i2HE0N~LMvh}c|5sS;augU>3jCL3^AR>v}MU=!f>%9BFoN!#;f6WRAGjg!-hP;J; z=AxF|HnRzUwC6KJlm>SU$U4r$E_$5Xq*kaeVWmGYFkX;zj;fCyGm%o55X6ugHnKNG zbXKB93+PJNkXs9)QJWjxgHAZ^Xf@k&wMGPjOj2%}fh0)-K$y=d<>_>c8(x43;PgUQ z2I)R*RD#4{il&0LE-=SjCo$6mUj(8?oenrv-x8});aj{T5j;ZFoNU$OT;DPMKA-yk zcuz=xiPm)cEawP3pI>ur(OuBVEkTGQ=X^$%IWA(WZgMgMo>Z!~yh%`+nug61VY}uf z5l>+W9_QAzZTb4!xYv{%nk~X-YNw#pdJLQEJIDo<7O2hUH}M~6>&QDBopDxnwv*nX z__YAO7y-ba$ow0P$k9B!L6uCHo9pvMXaPUOOtNc}0{)!$;&C1|3U<*mN#RVrnM+aw zgBq=Zy1eIx!}};;C!bfk4}exT7en4g3%`xuP}F<-gAt3<+#40%BWi-OE95M{H;3xa#{~32=t`drF&fY*6zgVTIn+qanagP`}Ph%h_(x=dj^yuWPY`W@BEKHw=pS86Vc-W3%MO?kECK+mzn`@+vAC^!z zz6e!3j1&+#2+rPtEkqYS!CnVkRVgRI4T2=|&J?Kex-0m<$Ddcv?Or%m|2lVYd_7}> zs)KtHgM?6$dMCTmO_C5+oM-8!OArr586sQ0)(hrUNz=v8@E$~RD_}?hlQg%mRU)y7 zcqUIlBau9vu&+hpru(H=WW)B^dBkUkcOm}VT!X$@j;1#rlt5^ahPJxv`uQi*oK6xr z+5Dw}Xg6d0%v0!mI=C1_ITw?T4R^$QLkQq@M8k7nVViUad?4Z)Hpv4;)s_YB>u-Y) zLU8~j^aYl1uC~BLOXgGw^##*Z{K8QfY_~%AdEY0-2$m$?bipxb5u(I)t)E~d3@fcq zu7F@8!Wjjno4kZ+?Fc9|z#8IRF=bJx%ZFl(^@c9#BT#>ngiwV9~_8 z#6|m88C5Xm^ua`bZh1KVi+eC5l-3~@&Ge4 zJ_zdDRq(7+c*Jv$!-;+As<>w@pFARzeeseOuIrWb7xdnT0!fyJqPu2F} z^EenE9nRzNI8N8^=~}izbTGv`v`T(1gS{qN07;;nQ?I*2?|LY$3DC&!4(hV4j02ON z&>>Dh(nL_{VNyT@hM;bQi<9$86%Zo=b#4sv3}B)#jcBtSacN@xS^(di0KAj{S3TY} zMJ??H_tNw9V7sm?GsdS9pf#|w5x$5<1i)GXEIf1_*P0ZK{`z=#LLS}NUl=_W4O8o6 z%909`xmwKnPVO;4j2LUIaF|#E2twR-drGhGl`4phuq;k|Iv{s6G*u@1$qq6poMt^B z0VN8?x%GGv<}scjkSi$dc+C_KB9x|%xKW!R2m#uf__-Pn$?$60#0fwX5+QoSU_$4d zEP&3mC+ZAJO>!G;0Q3nk9y5zLM`mx(JSqF(gN()eEy6S>aDws)1w%wT=a;4`$LCzf z2fJRyu3Xm`skmO=?Uez6&LcL8maIWBSfEVrAJs3Z+>si;Jf@+8rd&-g?UFg4 zPn@7Jwt8rlG>*lOVKh&^hEz|Jm7u_|P9|*+U856xZSJRXcybPD$8F^Q_G8#z$}a)< z-UQ$^26*{Gl@U)f?-9k-buSf}jnqdL@uDBK<5cnLEDq(MJ+7BYpnKOy`TMSyjT>b6If&l(qkn3AYGGYK2b>pcp{yyb)GytOhnB3h2yD)%%S` zfIojWd59Lk&afrfi`#30#$8P^F@_T}ik&IT5QAp^)0f9aF>I;KrB%b;zmSOon5h7& zf@+sgwfeDGtZFAlcK!w2z?PZk`!EKE5I3bgfWF_2zOe2K?n7OVbG$78(unhPS$mw( z`8FItii2hEk^A7u)sxC#$k*Kxg8N|vm>5<^acd--gOvCp3R6ec1s28{nvC{H3e2`T z3j`w~gmbN21VFO`rm;jI+=h&b2j~OB5#O$VsMgQNVEu*)BYg< z-;Ds^&mC}4w9I{h-4(|sXC>WD;@GwzrknVdn`DP{pTU%#my?0g)xjc6(|=YVy$=Bk z(8%JI?x#(f^i=t#pb$6&RwWoZkzq*>TZNvMVf{V+#DBZlv(9`M!4Qt8H;%o=1{rV# z$Qqa6y}AEESRfICl8wF>gPEg9T6NFrc=K4@Ca}s%OI9RMx7!~pYB1(^I`keY-6T`o zV-JWZ5I3C{Hr#sq#+JS*%4|eS(JNtHlEtDSunnV7ob0OxF#nZ}5_`t?7(P)9Qo;a@z)PD`>85DV;@iBvn0&kn!4u z%*pf&D-+_@yofE~J?40|uPkQ8ocl((j7=ZKOh+}_UA8nK(e=KxJR}DFK<)%s*Wu&XP7KtZs7H_q-XlXYL0#OVY6eUasT)^Mac(q^ib& zfh97<$OcNro_Lr&dU5>Ix^bZmqj|7p4xUJJVPeao&)x(?@g+bFz#>cBPlSMohLx=3 z5oFN4;yiV|esdKa)Z>2<3&%cNll_&2lq)Gs-vo<5L|eJ8woBTWDQ_pc?RrbUDbY2J zpemJwozkko2pVmKh=w`lgmY~#-!81$oNEZlTQ%d5>{hoK<}MPojHoc;Bw+wFgpH{- z32X0!%bd?d)6`6<6(McK?0mOJ6%JzMzvNNrO#n_B6O_YWH&iWflz>ef0F3tOTM6|_ z5GKL6iWp!}E5cen+-3MB0AJez_}k3`;CR>&MwW}73ER+Ou-@HZkV_{&Ly?1q$+`x! zQnPmU4p_mG=6qcP;5D|W$8?E#MhdGI)==L+aKq&xf$%h@~AezG#0nUdNTW<6~xG9s zvQQ4c5K>n%%B_ee>PqJm(X<{&qkVm61KRRLX>$t<-)Z^a)Ti&9@(lhyX|0S;`w53O zL3k`2Rj?}T{N8P^z4URgBgR9@fZk?W5>1S95e8{wsPdmWRPJ%$`E2Z@a?QdE|B}b^ zAadMnp@?jHqfpn-l?owZT)72@mdoe;;0*+GZbU}~m7=ty4u*<=vG5v3>P21pB)Jd; z2>&L{yP`|xEg@a9jz0w8t6Knn&p(@_ge)K;FK(CVTxW;+uu_mo@%whtved1R$I4zQ z2nAOpVG_PwUtOwlC|{bN(?k{pFf<35QFYUEnezl$0?%`aBG;QzQTQVK=QW_mL?CuI zn*q~&U{MSMsI8IY2TNq5x&qr`mPz@+ZV7-8qGgFp?U67N;!Z&LqN!)N%;FE76xcJ= zjpNK+y|R5Xc%;eNF)~W!)`zYn@pz#bslb~?G z!@*j(YlC!q#S}A?n^W}zdLM(}%0GL~1=_Q1hY1Pw1)GoGL1>&HO2$0 z0v{>JfxrjdS2G&gS*vqCLKVnLV|KSt+7+l~Yj|Robw269f_STW4_X#~c(?nYwcCx= zrN<-mWZd3&xCR(*k))9_y}HiBBZk5*_{=-_qhJhe4;%wFoy&_5KjO+^@6CF&3(dMH zWm7?}Bz^&ntILs_gd@M6t1``xT=p;xF&MCXM_D;c7w`Ygle8mfIs=uo&=zANbL0QDEx?xk7j3AiqqVNFK*da zUmrlF6ZO^P1%q95Y~~Xvls0TIc>)YiIuN zA4`sUM;?{r^<;_P_b1$2VVFXPtxOTIOHp0ql!>MIV9D{ za(t(x!>GHa8bDdrApr-14^db&wc8Ep_Cetp*u%tCSNsihA zm`ejqtfZ9@v!C}%0KW9~_j?LJ=etv&)J3o(g5XQd4?1#^T5iB}^;ZQzj6)G$iOnnU zK4U`j;u^^7Na007J32IQlLkYz-$gsXD%fHNo(|(qr#%++$#Sf#Ws(uDtUr(Am5|Lb zz_%-4sp3~9HR32JSBA``wh3jQ5w~C_Z*8?xGDa1Vsp@Y{V&Z{%bYREO`vbP55-*@d zJI%8ioLHC>+SE@65wH*s*`!@)Z(Q(BG9FBSU?JKD@{EcKWM89W4d=7pQv0LqB>Wkq}f|@ zY+YK1C$R63!F9P>O_xrV!gUq|KLp@Eqy>Nx8GoV}`oLh^dz>yKB@via(j@6+hA`mQ z-?M>xP1#RnXH$am>hrSsQ08K$mj!ihKXs-io1uL+09qm*=B~CEE6}K-u4JiiT>Iif zNOUBqd93&6mi6q|#6mPowEv zZc`{MH&|>3t*di!X)Foa0*7IL&xE1pR3Dxs*Dhxt=!4xVBJ$t!Zv-{(2Eq{X+)R*$ zh}x_GvE2En+5nwL8VCw|dcpd^SmR-k#YHrRw+r7=Ez?f3h|NGJ6aZg|_KL@7xFjBE zoFfrsE)SeQ2=qBs`sgyPAlrb*4vYMY6O1xn>$_;SsR$8I8n`sk zUZm!IP2csvsn-l(XMP63hOgme7T)&Zg`;}6jVL3h){H6 zheq(phP9k#+Z&zKrf_SNJd=nHm*yta!vx%(Gw&tfXp`YSscsm^KaNBwM_yY5|CQoAtg0f@XD2s`ghpYG^>m zyNGOZ1=ML#f96Zz_CES>M9`$Br@#zQWya@|V;qQ~ZqF-$01ie2F5m0ONh4g`Rqil+ zpMCGqu7fSxRK_{DczHK3R0mVgpcvkH&&mowwi4FvOVF?HT}Bg?+f8!A~f_lq2ApIMV8^i zs+*qBS>4t1OvwJ#1WV^;otQX-co`ew10)PIsg6*~yqT6|bvEDo-TpsA_XutzrclTV3Xf zI0O#UTWYo^*R=F?(OdhCCK2H8dqkO%>0BW@wBgmRIXqyU^g$zFSOny}03Fc}?)OxN zzS2C9=vs&zjsQSZ^KgXIp-FHc-ZL2aOXwkn`dzdZdF5itOnzkgHZWAH(CZOs*RUdph5-KvUgF`vF2lgPiqg;q#iy|W0vCeJ(Y5HIrs{UI{ z!ugYS`bnGxO=X7eId;vG8Tg44n4fTj4#p#G0M|e$ztuLPy0bZap6UmWuHWj4F{6Rr zQ#q5Jh>xJv!v-Jh14Fn76?iFr^-bo-G!s9k^oqApsCrb;ZMKI)rs~I$5pnAF2^aE^ z@#gt!cfrP<4{^*`n>L1wzmKg0aO*xK+})BI;OGRcA|9O!MoL>OMcO)z$g4zz%{^&$ z<3d#2c0(h0#gNXZ6&BdT<<92Q#~VhYN0BLQ(;d8RjZa12ihLNa%X}_B4!{?;0OD_v z@yERDHCx<-z|_DUh$|Zth)GxzSlgK6sc?RM3~yIIGSkVjplUEq)Hz}X-?iG?C6-+dO|`e#%DUFzK^%d{&pjVw^>m_gcHalMHs61gld%KxXUAOtEv3bVhTPn_0lPw4HWu z4|%$v6&g}7U`UGq@^Cx9U~+<@X%Ad0k@zJ5UyJ~70^mw}{4^H{QYXQMO_zo1>PKNV zI|R(xemN#`^pmQKgH%?3{f+E_RjF`nxOwdT z4X%hS=%FdOx;A+$kKbC#brALes*dJ(I-j9tVdvy#I1&&VnA_vW0iozBM^BIp8Gf<{ z0Ji{|>c5%9Y}F$VK=b48TRGgPdGCj|(bKl0JFkbzzdOfvyQlebG}96v9J3z7%c?f< zC#3J})qYatx{mpeL6Xr(oqNwI%!Df~n?gS=XZL#5xjFiIWp)Rzhihy^d_Yt zn``F3Y7VFAv?i6r=?_#!RINZzLXkw=%Vz8)k5Fa$D%Cc#=P`CGnqu~Rs4vvw^*~Q# zGr4u#wA;EWv8-j*gU!C3Devio{-ElX=R~nY>Z1X3XJVBfXLTsYmW{W{VM9112Hiz%jeT%_cp3gLEs9f?-Q1;4 zto?BSzBmEEpGf?zF4K8Z+=*J+FU79YGTf~IN%P=Y-%HysMjNr2yzS?sCK@Ve@PJLO zKA)S*Kugl>dWX$`G~?}=t}0U4%JVxJcrz+&Rr@EE1cn*3bYo-H8L_-Yuh};Sn6$22r^lo_}`8KTnw);inRz05cGB>>-#0N_O7HoS4qYDd95r@2p6mdF|@ zu!DQ}eI!CGL<%fIFlJ53`^;?S@}s&4q|aJW;^B%X;vyFdRe&?3mK|`KsZDAk5zRFQ zBI9ps3ZSedCPMQ@2EOgtz7uYHw?IFL+r`sZa7Mq*aSoTw?>c6GGzjK{&d&Lm4{;$+ z>$M}mry%+lAomt_{{W(IW5x%+hl>N@kQ9Az4sBxk=6F6y&hS*!^0W&6oLR4Mi0$d3 z-0xw+!#jU%M5fflx)H`(6EO&Q7Y-MI*e;kOxCC-)6je zt^++`hp*lI)dhk1ep0|+odAr87!pX?&bMf>#+<#6Hi%|XrqPE)nX*+$CBX$6$r0<2q==w+QIF05pru*nSA{35s&el%9W|aVP{oHTn4v z>TgE`569Jk;uTT+2ao9kO`Ot>0FMDS>ydxa&JXm92sA#-Hzt8og?`9ZMuS2~5YCDk zJZ8%GHf8Z}=5Isz$tK(O0N$rVsP!upVj~oXCpm?)$r=igSe^=FKHU-0}8pb)scSNqz;h;B)bZ*}visCgi9$F8FRzs!| zDgR0z{DitVwC@xUKnuT))aIOsY>aEkCgK~DCWF7!`_X3Cy2@l6!4x^nq#wW8%_;5ZJUg$I}1bmSBpo2j=tKNRy`lu!G z7OEMwwUBh3PPQ1o1mL?{02zNG+oC)p^HzIK)P*{W#+@!ilhkI!RS7=6aG6RTFOEFc zc13+|m`Q&%bJOfd)=f0{KEk<(>Bo@EN;VFa8VpEjyaPw5I;)M`~W?5@53psk3SK4)c}}rHu`z& z%b3LUaH(ap9Y4sKtDB>ZD9er4WJ6O0HB9VFvf>dZ` z_tP$4BRGQ~y%|m_@&PHyzt94RH|>GLDB)>@E>YVi)!Zu1B0AtzPaal+;fNUPF+z(MokThhplX7IJ<3bx$U*GGX z5t&q(<$EkL7~RXQk05!&71cQG78$~YEtLSSW(;i+VG<*eN4`dye;j}>MgVd|-b#QT z2j|_gw4r^$@AS^2Up+wMg}NEY12r|erw91ztjm7L#VWKjpFW43)KZ}GeLm34by$|Z z%_5%-gy#Xuxd-0+e;rpEluOrVWfxh;$FCH1Gs)97KZ{K^PUO zIT8MUSHK8)(oMxpp!>kLtR_ z_Rsufj>dE0$pr}2Fh>J%2U&#JJ<9+x{9-jcfY~-2_aUd7D51b=tN=KB?!2b3Ewy-D zjQw4LzQCLUOVFZ1Y`ULd8yl7UjRAf&0&qVSIgSf`vbY1>7>FGFP;G+E=~k+Le+ZMx zwwy~)W+WNWuZg-@om=nFs~xSfShWyEmX5=}{M@O6krZakHh^yrwehx%hO}f#%8W8b zjA*J`TF^%x;8xS~kHbtp&^33X@-p#2Xk*~vq!WLDfZO$>Sx?f|cX#pa#ERsap?C$= z-Qxood~wYh5+LdtDZ(#L5H^ERF!bX|8$X*torg9;&}d>Fdc!y&AWcy|=5z6G3Kq>d zdhpK!+@F2R0z$?g5x5RF9G-g;QJ>lF^X0k0At?w?3O4U&=N+JHWXh$uPlYZ3*er-q zTFIzXiW6wBT1EfXcSgwPt*L-3bQ&xE3hNb;IQ=*PU;P>pQwZqo7yGV%_G!cM;dh^G zKR(z#{);ao{>jfsKpu;H+f59n3F$CD;Z$j5vj*_Cvsov~B+)^z#~gKKZ9PfIdI416 z`K+?B5eKNh12yb;1s%qj7j+^$mf-&GJMT!<*0L(2=AYch?yz;}1!QmBRuH9=$bcIo zm6&!uD-9gjd+2ARq!9f}as6HFiAs&JZ1@M7hH4y$4W>YQ4LA>Tv)yCHO zAFBBzu)nk(T<-l7R3xh)(A;k)pNzu@V3}Ndn81jpwa_{AF?!;BoI-e{o9i8npC=^! zq|%5w71u%iQ~o*+W1cx-_K9M852x*Y9N>{`V3qFPF5?+H>(vqGE_1nqWPubi%t9bq z%T@I2E=;@salLGL70`2Bw!?%D_(gHo&~6+jH@WDS0DS8!Zv-HWA(SR;E>0}jG=UDp@D7T%M#Ue(z>jmAT|nmt2=7MvJhII zozqh=GDNOGZZ3exf}kyOq21W8=hDZcqlf?2^2eN}yZXl_b`#Fg_yXiQ9=#D}yX=<$ ze0dAtW_#fLfXLu*M&n)DWYy)4b=Y&%htf-g0$JHok=d8jd025fd^XX%ce?!9d1hB` z@+OB3EjK;^M>R35?*i~e-9{1TbC!)q0KIQy^*L#afe)qY(Diq-?mw(Z@`R-P_ds&< zz_KdC=sf~jbi#tC9D5x65gH@|sn+uy02ZFGe9+QruTKZDk2s4VnU6crqacOn&{XOe z-3|4ug7{b3V8Anaaok>a9shs=ToM5io7{Fo+OLzi?spD)*UPhBk1r2%l{d4!uwL2R zdnR8D@9T{?M+098(Y1(tu%|QuO(h2BHEzaE!8j~YVKMbqXQlS6a$Y6KS;?0$8CxY2 zy#M{G8-EGF7qfeKXo=1kZ6>1ica9>;!qxyx+&}#FGAS z;C?Oea8I-?d=n@-3R*=E$n7|l21WC!jZ*1v5Ce4l(|Y?)Q?Xkv-nty6?iYCMSW4ja z?A0JJOeuDVIj>zGR8-CSL^!ZPoihWVT4%Q_f}~b$_i~vYTgIEh;rVd@zBvO39~Kvd zyRo6BY;KU1Mc>)$bP?R$0u$dUKA&hLbPb!02BxP7Q%3^ldB9|g!%D+6(%X}X29E@h zB=N}|3x4jWCS+F=k5Xx}u1Chf9q{lR!|f5cC)|%jFpSC$7dT$dP zX86lBKoxOvWyI3MMlG&^8kGO6#{}(mo(fnr2AA}(Ca7qLU*8)f3Az<87O3h^5!3MH5!Rr#%2DNL2o$l=M#UaG5h`YzUTVlo; zq(rkkz!GCTNPc!ao&co1QD^uYWGN5F6+MV6ZM7c)@a+k}*y>N~_RZC~N*-HV(3!(Z zwfT&@1Wn<~?3EA(<70{H%>N}9z19VDB?8^XsG_=053(wme1R#@ubT?SCKgkU)l z?TL0zyJgc-(ZDintTkbDi?VO^AfX!heo=21>U;=f&Xam_K1(%FLle;ueYtyD&`x7- zIFzAq^5ns3)jgiF>9e!#I}QRhkFTt~?RT2`-nNK{HQ2bssIa{slmrB3M|L#P}=w9EeZWd1%9_K>`vl-2*8)u|C8*4Y9gL29?_}L z+)UB?cW|awc4+qqQPHR13Tkx0%fhCI>t}PCSUJrnFC&XcYg0h{!wXL@2{R}oQ#c3F zG(YgBeKxzAPF`-6dd=a}M~2G+dg!ZWQ@yt^^kF&)f>GJSrNAvcR)NQG-)yjej<8g#&6WE}31Jap8`2xnuc z34(!-+lZ?15Y6}gG^+U$0{RnT;#IB@HhFPA)9G1p)%)N37cudd212~X23K*gKA+~L z0&z7x_jhWWFiF&BjqEY6q4d6DDUXgR>Jyt(m~?$u%OLF>^*g)I`~IRvWBP!SctS{s z@k0Q}F6qNN8N@3$@mKP@i=+ReHMatX|ttjKMr zE(-I3O6AH%lnQ?<1;QeRdH+~dM0UaR+J%q&`1`Rq0C}jG%Ph7hNFCh!P)VMIXWAZg zM49Qv!{UbQqanHq_at5J?>~Ls*C*8d7xAEuaqoW@K@^mv;m9)$B5KC7`<^Er!`c&_ zrT~9N+7}1u;1*^sRdvs6ko%%JkB(T`RlJjr@x&iKdG*v{eOM+p(ZnZY$?ExpC3S*5 zuI=Tm(GR-lYw94aJ@nL@r-pxNYw>~w9rG(iPQt2klxr#Lc6i^PaYvArL1-19Pc1JT zTT7c?@k;={90eHG|8K}h(6JVw&)TZ!Q85$t38A{r>C8GH4lN0lsZ!Fm}h zq7`e&%R1Ia@P_?!Wpg7D*L{#9K&pLP88fnT2))l>pzR89k}v{snI86VByyH1b6UU> z*pc)%`cB5}w<7CquuCenIda zl#Y8!31u=5iIN;l6AhHkJNFQ=DqykxoEd7?6=lR8?}^A5fE>$Mck0+!MH%0RB|p15 z7z?S`Ze1Xgqlpj<3HWKq-XQm^ea%yhXHYl*ZABc1syd!~xSg&5;#|=^9YfdNEEV`E z7<3Z~R*81|rq=D1@g?PEZat)TW3?q8t$Q7IFKH_Sv|VsBp=ss)rU1UW`j19XB4lwx4CKoYB)!MRw(2L?;Q*k5v_GmY@)K%idv3W+7hV8#)dT6LB({|4FLho4L`<+yiLYtX1m>M?*x2kViQq$As_iiu=Fo> z<=-JDEJ7I33yGql>qSuLXutgAMG;j^($Q7KL60GwpRvzZgo|bY1eHDV=MT5E`7Z(Z z*7_fyYC{?NNogvNJ|T5^$~=^uC?&k!X{j^3pd_L=gE(fK(WnKZX|Ikw5TDtr1!f(l zRu*x!`dlc<0dV(e!#&rRePko25tOcd1LDs(Z&#vo{NA9L{6;0W=e-9lVamSw7p>C+~ei0HPUV!xMbo zT?e!%PS@hWXxax)^Q8ZX$4B!xN2xu=-R^@tn-WZk&|7BM34!EL9!mdB*36XVkPupo&zd&i$hPw35JT(qDeIP9iV471u^?20AGy( zFnb=4i$XNW+4D^CxoqTqIlrB6&TOFgH8~JQBs{6KtsAqy{qux%TUC-4S>BRiPHf+7 zl;@0jJEs65dn?}&&BA;q9m6?MCplraaz-OfYa)={On7vY8Aei@J}ad%%^uzydG5)t zYmmMEQ>TjP=Oy=2HWhzVt^7d?8j9~suJ298#~K1e+9;QDL79MNlCoy}!i@J7tfDGX ztDJPo)J-<@*KAn*OCI(ire|iU>bvewE+nlAOz1ghK?~#-!bI}s?7i89um9Pz`3b_{ zMExAQ&%N3)S;}hWB88Ca(%Mi=BFxvbY>Ak*mS(>{M7&6}Oq%CX_fx2gkz__RsKr=Q zmd3Nd+N@*MXH^%4ZQ93dYZ6c6mjHZi_y>2JLM3Zdw>m{!2gQ{Vsnk68%kipB7m_3i zB8cIxacfuB%VUe3H;;_dc!0>%?b7e^;CnPWZy~8VlPV&Z;;=HL(t4R9vwHI%M)Yoa zWgJZW(QUj6ebN@u`?n)hbSKi4#|%Pkp#Cmr%toB$u_|g@1baSpPbWB4+OD$?KFNqnx*NU3CJ-m*$-<_mUetoK?`^Z|-6S5u zT&{5F;lfzUFXlBYJFlyjId}JjGqe46ESn+o7V_=--!NCvMlhyTQ-%uqoUVCk&)PWT zsHJWNMy$8YpYdw^u|41ki}M_)Bji&S=xlr!o7qs216-eRhQ&`h6%h{u0w<@%P6X=k z*-u{S*X~gsvdL^t+kI#qy*;K=i(yfD#zG!OhtSI~E0M%<-n;E`r_ z5#WPcUHjac1fCY|M3&5l6!5=)|L5M`SX_ggnk)e24+3kh_)kF+5fHt zuk6bq9F)$`RKpPm1-*C2c)9IdUkPJDm?C)1+PY1PA;FTqzV$}}z{`=qwmntI&>o5CtMb<2{5^_&0^3V~& z`GyNs?JezCyKrd!@GOVB1!PQu+Y`L5r69>-!$Gob>jOPvTqdtAB2al(vg~{pdww0E z`Xth)&!wB6OTm*8ADWiBNC_3Gt<(Z>#pZ3yBxY93?gu!V0Sh{?l|-+ z^?+)%Ovn=~>Siq$ZUt_MbrtGJX8terzgK=SxMlI<0DO5Hz$*2mnRlF`8dv%dd+9vq(>fOd@STtiM_|Hu z4vp(eXAp!=Sr1JcruiPqWI^LX*SSJ>d=Er#i0E44c>135Ir-GgwLd->Uj+UgKO7_4 z*3}_vOuZPQ0_e!iyNC1CR>%j3J$|0^Jmt~$RN6{9?;d;4nK<3wr!l+Iwy=qUwk_3q zC=6i$!y&9`W(KGt=x}Wl)vwRlizj~1Rs@ZRyzV3hw7r9<#zYvLF?*3v*?QmgYDC;)qWu+b#OEcNB7(7WpTm`BqK;z+zt*qk@{LFy9 z9RcV}R$PNUx+*j@`1-g$FA(fxCwc+Y*XBh7wn#XGoBus{`#v7nh~#8bA$QvPZY?Y5 zgR|4Su`pXng%{y0ceaQnE<=IW^G$*iGzHKZ@)#kGvweZsvsUEHCda{KXZ1K!TL8jJ ze`wVR*9kl6I#s-ze?jk$hIAN}lagk$>`sZWBm}X0u(%zr1PZ@z@SG}X^B&IJJ=*oX zR7ibYio8X1A|kKaPxjBOMS9$lwbYiFigFaj?cUsrJm1iR&IRJDtUd1J%$5Ic*CxWO zXh+@xe)oHB#W*>)+--~3!og!&t>*}WlMSlMg z7QB1oHQ5>}x^xR2VQiswR!-ewY}iU?_v}4GrAt4(;*l#je={6}Dd0rRh|lLig(!2AX2AhuL?M(o7u4&5I+;|H#xo zI8O=8Z{iU=(U822?)d#Hn3c4{{=*zbEx1aX;tnq9LPgTQ?w>iHcL!z3DiFwX_Jg2x zN&*V&zwwEnqZ%Yx?lT7R9f6UFQTPXYgzq9A#HEX2;SZ>4VOP{Jqe8h*Xr$YNbYeE~ zdc+>Bo`~iz0r+D0e>6}d9AS&fDt^bs!e|nU_)tH-0DsPJ{^!C4&}Qc z*%aqKj_x}}#2eDf0m9GfmWb2-yW<{P9(>H!SZ+1L$%MaF^_n7b1|}~OTJS<)BJ#pY z%CBW0aQ}TRkef#k0}EkyiJ%#LUjeehg-EXO&EkB4Fu72Ryvcd{^8UFu`P$A>Mqoh* z@k_~V-#hN=A6R^WsZ0tZZNhFe++&Gjav|Un#=jQ8_a*=Yn?}?CaI)^?U|SS=O+5@Q zc$WNd&b!VOwDi9pwTrNxum7bEJT3*!3t zd&Bq+4v#kk`{EZ+e7w`Gilepi9c~13@}c*3M3Y=*G%X+ttlldwXiyVm(pn{nz8x!4 zr5uRteng|M52=7qs9u}YmFGkt*ubj!e9OhI3D>YG1V7P5>dI`BLD&rX6xZqI_OmG6 z>F?!tPcwf|qN2EV+BI#re_z}6J|M=D`JvzwuiiNbEbsIh0Ky3G2KnHCP9{Ku8TDeE z=2gE=SwQA2?mjujoqU5tq_SCiX-|lKt|BjPT76LQqjk;3xbN-DhWSurLs6=@i3;%D zR>z};+(Y|L{Urcj+yX!&>(3A|4zM;awr;lNy>a*mo{xz&0l1r#E0rbj2Szlk@eYbk zh3Ezjg$8^?r?E*kyVg^CL}t#jCN&(029^Kg0LgdN+_9=Y>G?q+WCw&iGaem!W@OSFsnJ1p#Qg z9#&Mvy@EiQf@Pk>d~h)LL;K#R^C<7_JPX>^Mp$4)42+#Zz*{Jzd1kSyWd0DOpB|)E zYGOXJ4(PyR~@UJ zm@M!gN}%++;->@f%?SW@&pEs7;NUb@R!%%S!WBF?{i;M)W7onZK_VPYZH{!u@#a6+~Sa zAA7Mrx$vfc`84`>taO^*d+XLl?Tu(!B&P(Y9kn}Lf0d7omJG?2Jy-2qxsEPCXXCPG zZJILwAJ#guKpft4=5uLy5l=xL&F|as$3|I?+cL%M$J;EfNZ2JI2c)A#UZYoIEXnU1 zBJDBgAD-#;9gTRa{C5J9a7x1LdM~BkcgcM@j}dz`jwS)_jOjJDmr*C|(TtaFb{o>* z@Qla-au>aSzNLsqy!zjOjsm7#lWW_%1-@7|wqS2h7-Ycf@vcnGSepymI@ zn`6s|6)E2w-%}NuZ{UC@QTu#zzRij}-0AN?$irdmu(R7OEtb?|!%cBKsH2(Y@Xxp$ zvqSa4e1bf17SMm?*<76xL-L4#hWaeTin& z6YuZY?DQ09-y#mhT$Ze=mwbLnBdmCOj`Pr}$>w&?#s>Ps=Wnaq?bK`_WrS@)--9yG zq-s8HBHa4kuX83p1N91QsmxxP>A$z@avdu{7;{`#S@$^_O+kVg5tvc|HJfFF3?7Y) z5Uc}*<-8vZv_>cDtjJF1Ts7?RZSoKpFP_6M0r=JgAZnlaEqsg*-t)=dKG_!jiO+uW zH~fY3{YS3RKX8l#=b-Pu=#YVU2#lXpiEn@R@b}aEKWV}ImG^enAl@DCoA0k1g+!Nd zcq<0(3D<91;A~!)*)zc)_dFcWQ@e@JV|4I7@B4m(v<60Fc(ovL^m*;!__PvKMznEw zuJ{+j&k@TVk*^OPT17{h_}E@EzXagh6M#=E;7_ZOd`|%SxT-#U{;0b33|r^5|aIQ@_T*fD}B)?NM*^zPM-Lbr)~6yH~h_tbjAEy?08jmU2ifa^r?Iz zOx%L4T~rM(YGAzKq`aByf*_e51mEmvM%hHaBI|jGsZ73GJBVpNnn%(M!`293a^XIV z6Op%A&K`wJg413fu?vtXCT7gigp+3onUHgKo91S|8G=+CT)E0M57k=8cp)TrrYUz0 ztZi4cLRcrE{wx{=^W3SY`AY!4^o0%q$OB~g$?*Bp=idc*e!m~jQviKR0vdF-sQ$SC zz`M4BsUDVN!9xQRBIkeL{3mwR1 z{?k{jG#bY}eYV$aguX#?n#FU&qN$1x?~LRXIEPAeda{5$G*}B6C0w}OaYp4R?2$>j z-(vC!MuWgKChayS3vnBJo!c(~_|^pt4Z9Z)mGh~BK8dn)W-k9Ioc;kkn1_CFXZ(UE zZ`pi*JY7%x(M0EPorj&z4*~cONSwR-IX@6MYJv{lO}-4Tv}>mQQ75aA`JgLS8;Ni-8%V zV;)z&`s!$uxo8e~w~02X2KSTzTNJ;#Bin-jBsDs6izAiwbe_s>A&BvA%S6(iB;{?Ev_5aqvHz5EufjLaza3y#vy5)kaO~5Oe zAPOS@)NN*K@jRLAXoZ?wf?JO*8sZ>|2~9VtBZfRrgpU?jz=!-DhxLYJVxUR@?iTsb zKNKS$uBh=e7hRJZQ4{Rk6dfO0_wHVp&peuk>aM+p)s*R%0Q?6a06f0sbGxu7*#rKt z2Rl(&$VE}^G#l(nZrLQ!hgou$6qP`p7PRwO7TCuRdGV2Iz0r?v7tGXgx6W*7p4y+^ zZTZ!u|9~y)cvewzfV!wL9@bqJib-Z-!-RHl4s=^>jtqtH&MyHa;XbYX`Y~ca3=@UQ zK0jI4vOz(n?!UtQrn7Jj%?j9~VfMRWPF?PzXW~HVqay>Va^@8YY>~MudgLA-S-kk1 zGQd#jUnVb}Bxcg z{yVk6Z04Oid)5<`g84!}3c!B|0`PA9^)N3lPJj!23*YJ#(Z#&rt*Kz7byrj7&;@~83`c#{CSTbT+GF*&bl z1@wrkWQR@GCm|ayR9q{mWa44TAZ-z4rAWksIf##y{1Sk#MgabFh|hfJM%8z3R3zWb zCG`=HAx}JPYdO(1(KDezcswl1tX}sB*&dKVSKJ%TqL$r){Ar)_e(#@O58#^t0Qqup zK+TfwItXbnicl6aunTg=nRoVf#d$a`M+n^VxDC{CP$@K&P^_lAyr4;dSPI*ZaYS_$ zmLee!ya^Gg@C`*5|XZ0ev1j|I@9>4Pm5n! zJcl6!^!XU%jXw5&m-)#{hyd&jUQAHjt30-jI!3ic4bo(ou<$^{_z3}h^@29uiT-p| z_dC{oXcgTm_Pt9YKAoX|ngn<{pE$htVT@16M(?hRRdOPA`Y_Fa{N0ydp9D}OhAE_O zi`g&}44m9r?`=$8xVx#H18pg259*S8AGKJMu|7cz8j>NJD!tc^IX>qoz6pB#PpX9V zyJ(!E^1}t>lr{BVxS3=Xxt^wSjvhT=2Qm+^twG8M`-ymvVLbVe<565B%QQ#yH_w|z z`qu*Z;@6*iApmWVJ~SzXNOaJC_wkcB#ncWuf9M%@&p~HWlubo*L?fE#ql^mLG=uM> zLkF`-G;p}Ku$IT~^|j$&l>m=yRbMM{FyrB(Zko7YNjyKbySzG`|P!sZX4Id4KE zinei*ydLw8o`YX%A0_M@$HDeED!kgQp4nIdN4K!r!|7`h&@6)S zY`XG${r~%U$v#-V%K=am-thpS;c1NYLkGvv!0C8E6^{Em{QXgx61}u@9EwkF0hGU^ zWB+p@e3->8njHG1ClTmyKtWLm3}}-5Y+aV*ypu(vymD91X}9XuL@Vh%dSwyjYtDKL ziBcr-?)hTtcaU#yhH_b;a}9|2B>-QG0L&zyDH}4M;l7UTFMm7v1w29M-RE5={gM9v z!9EVgL4^bGII=dmZBaDOD_``k`~>WGAah$~}^sldpK z$jjn5u6=A{j!EX&WEV`F8XZaN=b=?jue*-Sdt&|@vjL)W_(S4k991+)NUgQz>iC`xt)g}hKY^vhPeepO!p zMkAatk3-KMr01}d0-MhWr@uv=P|l}Cl%#5h89>37x&{iRe;@ZLh{CT0@YM*w;6%3z zqz`#O;u-NTa9Q(kJxTUw(^vPA!B!B+bOg|?anX$P*)|7SkU&3=eml`5D38|-B+dML zeS022FtV-vcoE0ZB!p{9z!~|C2vyj~TO3G!$;k4h_Z&WPs>C^Ib$37*%DhOBS3H`+ zIMloX&{bQ9-3Vdf>G3&Z+w-!y61yxV#;woK8u&rgGM1e#Bxt8`2*#d8T*sB-NXWwl za^0LAd0XhB2>d|NnVD#iP5~qv*YQ9-tOeJRg1Ql_M1|bt{oQ#{ARY%aB%6wU zP3?p#1A4J=nwf^JF+UE#m!oEM|Igr6`n}z#od@=YOj~=twIKFnRr>4)osF(oYm85y-^C!W$OYR?B0+(QrJ@>^LIM3Diwgc{xa%^3DplPA-cLGs&oUIyI-?4Zx zz{eX}NJFPWWXcYera&ZuX~cuF26YU5BIrQ{qYy57L<)Hqrgs8pkx%-9VTpva ze(xLomjHb6Vm8pv`e!_7cR#cW(iX`R9Nx{_ud3Yx;puaoDqzd%vn1k>h?M8|T`)fI z5xPXck3FNG3iu%a-<&W*tHf*quj%!#kdjeMT*MX7$y@?u#ajL0Zh6tLwM!LWZ)Ruk z@5!4~XThNUeCGX(qCMx$aqy*~hTo}_hvv8;vY7^i7uBtqg^yPsdg;^O?V9@`8v@Vo zYd#Z^i1A7mE(FG_N=~kJd|IF^b|BO+<6=$&RGnxd0)rJ3X##)~EfovO+rk-D;gEau zbbVgJXK1c1^xhj&CDAh21@BCL!TgLupf4bZbOmy&7XA`|Z%qJhcqSVO(N7F}TG;<& z@P&sSe3O+QO?9Gg3*?)90Ux*wANu^|cuw-zcz7S0wnxM4{*eH`8~VqaUu^xWcS0aO;>DgV95o#o*j-(m>ErlIj_xi zm=>_gbw9T_2>R`0E<4hsY#$X>p_H&fejzY>H_o4}hXH?=P=Pdq^Ydhov`~iKLRgl* z2X(;BeL%gR?hz)LWI}ykgef)BTKr1@zV!9S`_2s{|4#64GzIrb{~O+0w7#fIm6mm* zkuOb#(NjnNJlKxr+(wr?q_!_k#GpZ>#<9Yy%^C0Y|hVQeBVco*f2@y5PFiJI|Ny6;-4;ncW_?mrt z{F*l+J1F8i)(by;&!yKfnndJKEx@732eGH!X0gPiGZcwXnc>0rVUv+~JE0^l`hA;{IXKxkE+72f8AuzjAI?Q-j? zYl(@R?m;xD9Rbd$LNA>zhCKtBqH9=Tx6{aM9;OoQ7!l|d0w-$y1~vRB(R&A<=3o5G zUwJR1?=zXn^Dd95Z9^XAV{eC--e^p;0&pk)i(dlp-H_(s3K){+GeWhk&t^0DrgT7uWwya{NYoN@m^--e-TAcYU{f6YyG1{sTyXr!w!8 z?Z>$-*3Q{_f}elUEX%I}BPiB3^yz|yA~bv)L_ZNJZNP?afHcM7W(vZ;=Qg40+(e@u zrzajhIpS+K>}GZOa{m0uMe<3jtynO4QbzClB>>-!0Qk2YeYV|t1T>Y+5ej{0yc6+k z=<~41zBL3oi3-I7T>G@0H}Gz|-%h)|fzo~ez<)p%z}^mB;Jk@{nOSqbn^=`s_R}Z_ zglmrwPGVjf+aG(ry}N%qU4b`&9+>B_w~aY#er4_B=bJ==uEChwJj@J()CN1w0^FAa zhjGg$=$2&8_(R~4wx+0Q_wD?tQ?k$1eOG;Rv1Qf$a8t7AwMFE#&=d1~WS4TMCBEHr=UAFo=)o!AS19++Ax@)YP6~ct20yZj-j#4rko5rt z5J=sb%*4NAASHsD7jhy>A|0*66-N%%$ef!L^lJ+RsH&Tat5HfHLjV^0QQ5oE=p%@> zLYdV!y-$@|>4{0ACF)z-;wcDubdMe$D zqHKC*)hLMEvwL)Oat>4*$^bgV_b$9bKwCdXT-1u4bFqZ?oM_*|_QEokHfb_3V* z`9O|qe9)H{qAlUrg1$}|26%jG<9izx7=gFd|trM$nfJ^~BAf2YG<|XzR>6+_0 ziHenWAzG?6&BSDyDu~yQNQzup8bVD=uo2S=|1cI#0ff+cFII`ksbv*S;6$4HMiF|h%m*;shAD)uA8O$u+Uh@(!w zKPdibqvPJKGaScCfbVU&F9Ki$4Qq$l^80cU@z_e2Geyh(JV{aSAbouZLN;xs8wtMn z)J&Ll3z7rox?aPmAR2bRY^SN|7&qCb;3__9&YXdCsNm5g@OM8r21Es2;ufl!yEacD zNlts~RF#X?MmM1JWB{Q%ei|;>BdM5EYvz6Ihyd6{0(21wT~#ZAeH!Q76-mUJplC!$ zDRR7O0Wh2wnYq!p2Q|6ib_TaEKpRM!7*P5I4N_7BgJ`@l_R!+>A|yR80&K-O4L>{J<1wFt&RS$C4AJJZN@V4+GjkNunzA2X6kuEx3~WCf`q`2rG)O1osV2cqrQP~6U?{qp z(s{aO49MtGNrgZ<`E&C6U!tg%!jsFnZ*J%7K zjL2yt6zlrAI1XlB1#*&N-n15mbMf5xx!ioP(k8?%B8N)SxCDn~y;^3xu0bng4F$v! z-?1VCKXFFJO^_?kVNMu2q#*4VeU6|x4vp&Jl*mFPO>SaLkpJf}s$Gzj7XjFNL;E47 za#t;z|B~QPH@}2HdJdK;;F<6k?^d2#D9}MR!;v)F=QipbK*Et?B&tbXB06VW25d5z7R96teJ$>DSgsq#m7%VLJz+p2c+v)PdLa#o&*oDExW%_dwd(NJF z)Bv!iYP@WB(ro|HDme8Jn&|*IeK)u`4t=0O(dxfzbEEMycv{ut0eKJ)k7M{Pp^6C% z=V-J^fM+paLILo{5310IHv!lc0ianUnbQD^Zi-^|8v`|<+lgEGF$HqxOv{nT|L$}e&I<0iSzq^wLfV-By29a=5 z+*bW6b#g};vAcpYncWnwK(vsB$z>m>A3S=^8z~{8D1*A`nf&NYA2|@kpI{N%fH?@6 z4Ml_Lz*$V4ARvCxnlRL!xnU0e%Y`wdWiCUT*yNwUI;n~>mfE3Q;=DEK%T>N2Mj!jx zn*i*L04SIaHDE2Z0Zg`}1SzTau>`Ly)_vC8_X+Z9%(D2iDn>t(4Q+tr;%B}A94d5q z!=!y5n=Kd%%4dY5#@0|G#5GEE-e_6y(E6ze#|7~c8!}6=5;Dawvv)~rBkq!362}aA zlBa2TFfV5sY2$pP^rex{f9w@UFqH;I^!eN_WYcXP`;%G=&<0_Qq`D}K>zUx-7V|j0 z?ES?6jitd-nSL>9DF?OEzq%N?P1a2mPkzi;*xPz#KO@8c^;@SHJ$zuo00f?{elF{r G5}E++n>(@q literal 0 HcmV?d00001 diff --git a/images/gradients.psd b/images/gradients.psd new file mode 100644 index 0000000000000000000000000000000000000000..2ec1207f9def74fdc2c2a416549bb76a0a02ba73 GIT binary patch literal 5329387 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%0AyV>31?sVJSTq2nmoEV)rK5<%N zd}2o8!o+2X#fkSNmL)!zxGiyK;?s#QCLT=uAn|bG(Zrg>UlK1Rb|pHKPI6H4$mB`M zvB??9xydV&*Cm%Go01<*-krQJ`C#&g$w!h;B-bZjO72c(i%N<{6;&3EEjp)YUeUXX zs*65Y^wFYE6@9tryG0Kdtu9($w56!EC@daQd|dI_#j}d%7r(oBS@F%qcNO1P{O#hO z6+d45m*VZksgjbCBTG&%nO-ul6c1>Q2N`_KbLMV&6Eu)JF#q1*(GJyl{J)oyzIWR@0IB@@X$XGePdYpuv3R!IPCqyZX0&r zu>TtNr(wH?mk&Q}_}t-D!#_Iw{^7qIzG-;ph*2XZj<|BfiV>e0@x2j$81d@J(vhc) zym(~I$U8@VbL8(wzC0>9>f}*#M^%sdr%~S;_4ugmqf17gK6?J>8%EzV`aegn9o>4w z$Rnm4arF_m9C7~yP}*kv~0hd!}| zkAB_V{bn8YsWr*?C!UX ze%m>3tA5+vZ~N)no;@yc+*!vhI_^Wqee<|K9@lyN3CCZ0{L16Mbo}p+-+jW7C(J(K zh7;~R;WsDjJaN>C=bu=2;=L#S_QcmJkEpz`vcB?*m8&aTPde_Tc_*zp>4B5hp5%== zeaySYe0BSAWx**QKIQwTJbP;SsWVPpe(D!aed5&g zX{Vod&1s)F?dPYxdiv3)&p-XP)4zZE^Jfe>}hA$o&D9bpLu)n+h@ML;q4E;ebd;%V=o+g)7bBi-7@aTahH$# z__&{sdt>}5Ki+J!9dF zPtAC8X7S89Ge0)-S2MG-rp;=Z_0w5<&KY~ojpuytoLA31{oLAfzjf}*=Z!h9>bwWe zd+Gej^RGYu8|S}t!ATcXUGU%qTW6mGlb$bmq-evRtZQiE& z$Iq{x|Iqx_cT9iBN8YjevcZ>Kb=j9M+j{v~mp5Jh$b!UzcP#k#1J<%F{QOGi z%K2CR`;~uNc>2N*F8rT&mb`P}JMVwzD~l#B`tYJBt{QdK2d?_wRjI{u7Jp{(bMHFi zU8~;p*ww?Xe(%)}U7fz>qH8{P%}ehd|L%{xd(E}SUR!tVFRm-S?&|BleO>2!E`HDF z-?RO_Q{Q{ndpExC^!MHJzCXPG*!S1J|JNTF_JOJo{MYrx*I#q}_pbM=uB>{ns&mQw zC0|+6T0OV=3)Q=7X4l+Xv$OWR+RxSQSbE;l&nGdS>c$fqZ)tpH<=HFmTKUokXMOPV zA8c*9tm)g$Zu9$^f6+1;i>W`ZI%Cy8uiA3c`8VBvQ|9KYZ~m`aM%>bH%O7t&>()=+ zy5qJ>Zu^f96@94sLyvvo>FwXWqvDPm z?|Ay-6F&aAk9YjjHUIR;oyXsK`<*ZU^QHg%{kw+V)pXaUPn`3Kum4NYztsK9+D}gY z5K>>69;h_DlYk zmw)*$_s_ZiM_)PaE1&#I`l~fx{qxsmf9;1~KmP0Yd_DJ#x^MjTflD8F_`%a2yziSO z-@NIYuYBw3Z$0rJGydbDZy)>Zd%hifr{Oyc_ABzd*qx)e)d1({^vWtI_X#U|N4kuf95w8zq#`_ z(Qj}2ZRhV+{%-f9%N~9Cu@5}<-0$E0`wgq#xq9v6mp%UE|6cOHzklMwCw}|nc~Ac8 z53~O8%co{M_475;);#>jsek<0(^H@R+1hDqAO6$yKmB6e%yo}EbM7<0`SS&Tesujs z>;HGd{0(dVa>ZYs+4!!Ff8F%nO)vem=C7}AuHU@(*_)pAp1b||;^*)F+wi~L_rh^6 zJow_7FaGGIX)pbH%SBuMxb>>7&%Ipz@~&;o+x+c!zB1&M`*xhTZi_srF;qztb_L7vy z#W3eWrv^6+m*8e$B^Djak#9k2mfT7}9MuCvr85_=N-QiUU}K`UON8?na&jjvSm2z6 zOqo;aj+9$*ybI*G$I2~Iim=3eTb#eaJ;T5x05egx`=rz4PLe#ex%U%wvdt&%cab(Y z75?pxgS$WG+T$-}I{f*|SraDDnlP~vKYuAda)ib7H{85@-$+;<3FjM0n8D{-;( zK+feoki0JLn7l6TS%tbJ+?d9sL`>UIbIe^ad%fbPXE;~qD%ld6u?rz)xXD&LF_J7a5c@c>k$4sbUWHKD=vz%^7LcuWG=q%i&J0!kOb#VRd+; zvrO(QuW}lk8i8qOZbEy}l4T8AzO}A~WhA-hR$afOo@Gi+__~Irx0rS*-`H?tV_~_z zdF4`57B8)@t|$F6B>5wa=H)BMV;++7Sk)}MI+Uj%4QD+Pu=vxv{EbpmQ(j+nYi-lw zx)rs&|9j!avH!8?_Q~%PIhNkiL>DLS0sf5Li)hOV*jqkPi9AXb2}-8cr?4*eq4L*j z>z7_m;VLJIRn_wJ@lxk{ z)yu@{MG5vUK2a*#*XoP=YV~1xpT{0_<*fzQKLxagb?5i!hiU}ImFSh8dZXwcqc{Ge z$KJplY}{3V;hn?{PBF*8Q1*s<$%hz$zVQfp!=1f83Nh&R?GuhGdNThown@YJBR}xh z>(Mb{pMI*eBSA+B=r|*K=&Rn0p5lLu{`zf~{+fO5?X+e5hrT)@iUQmvOD@2Tv1S=P zZt>>;F#6u%=z!5*ya)Ytgi}jxHD*1zCKW0ttag{2Doy*1I zzguy=T=~Is9y3bT6^@egzR6Lt@Gg#$VV~}ClwfpllwhT!fBhdN*7kiFB^Kwvb495&!w;OZrd!en9)3m>aOH{jHBKs?GF6WqK@9(L<*iX`5Uo@2a-(OSASm{fD zS)2p+SLr`Qe@(fnYkxIY?%PqOOk1O4WERqu*un?d0ayNn)t6*?>@W0_p`jG}-(T3| z6vRHz>BTH$aSq&Ha-REtehoL}#;*N!>+NdIE}!mwu=P8ozjWn%H=8d$j~y`YQ|zyq zAE5;g!OD3`K~L;I3-vroWWVu$-|BaDvHI^OSMV?Y=LJ`~?*#k@Ky$u(g*y$klii7^ z8;5g*%YbvHTZfkEfH@bu$p0L0xE}Q93Fm3xFcoPbs7?jMd$9AacQ1uJi;*sXOc#LC zLYzfh1(~maW@m%KL{J{@P66Dt;7|{$Q^5ClP`ngW&UPDNn<}@)`Ksf)KXT3h{MXzc zy1#KBfOT&XS;o2Fb;mgif%DJq@7(`(|Ki^2eipd%oyZvq=^k*u?H=VGfgZ@Z7rIS2 zJvkbEvj%qjwDTIyOCEI}bRTvualem~l`{8A=O^x$+#fp|ohfdkbFOo``yOE2>lQgb zaenUJ?d);xf$mp1k2{Y*j@!_KQ{0OIU8b)+9ZvhRNWbd11Fu(*`)bES_3b+`MyVCoZz8qDE!$E0T8G=w+1cTAh8;zn9ms~rXFHLMcD|#(vsR=>K#xMt!iJ2tERICpaC5SGnDKo72kNN`ABt; zR!J>n1XH}k>bRnR$i z$OtIHtF-z_8BD*>cSnhQ#(dg8${_440VTeDA?1T;2u;gKpK^nWF$q~hD21n~Vh&=l zpyOCUA(X)-K1)cnXeb=il8ha;3$s#Bd%uE2$gSq87T3BxojXvw9qDgKZ0SJS3o=?t z;rflvZEB=PPsEbq-f5 ztROaCu!*z;2=|lj~1g9XX>XKK}vNPJjnLwVxleR0$orxNK@dIxfQQp3|Jw4zEA zE^VnO9j2130SRP_q|r}>>4+$l^MRG0GIz>aTfm)bG z7bBGz;4odRKy0KGkP{RGBZ6E38l=kbDddF=weeJ9D30bRofFB~5NJb~8XDsu19aFD zjSes!fK#zFsO3I2Yy>j^wVL8KRs8NQZFoT$qhAXoVCRNQGJu%%qTb z&8CYp=`<=mlSy}^LxK}4LL!h7B`WNJTIO=d!MuPg5dvu;nU)$yTD&woRq)$U3z<<{ zL|9x0D^qetnWB*v6;Q!}h+Y(ga1>!1g-io6gjf|8Mnr?|=}af6!cCyG z=nqp-FF%$yFu6=7%3wH)wo%&6q=U>*nu|%_>8t_pd+vR42Igea4N%7lCawjmLUqZXn3Dl*%RvO%WIbVml#vKnCm zNxddhmd#}3oeeWdW`LT7)>*)0+a(`Yzo8Ip0hR3b4A^B;0^?*~$rKSi`v%Ia@61G5 zh=saD7S-|zMN#W26Oth_lCpUyC1l4l6dDj_350Vl~*L{dQs!-N6?TfhjHEtXGIk$6b?h^1En6#%$_V5=^ur*wqZ zD-BOL(~!=VA*U}t24sI>bRy-nT>v7qD|4ETmN42vnQ|dnKsI6zfdrxuz@qFZ(NLg7 zYN41z1I-7evzgAUlLLGXa!P8&HHEarT%lGDhCy9BJ_(&hB6Mpu%I(3m4XH!Q%)Nx< zA?1)>MqSVGK`_T>@>Fr9m)lj{K1(bLVh95E8Ib? zLm8C|M2JnNR)qN!hxU(hMU+%>u?(Ued=v~_+AYdvh!S(B)MzVKi9@vrHKNKiSRh>m zqGGbGkYESWD@cFMeG8v2=F<3l4rv3@ZlrYXReau`gG^pY&dc!~dPO35a(tjfOI2q!{2cfkXscK{5hb1QH&Jq71)7xkxYyOCIWzBohj9 zG0Ej1fECZn`M?7wz_2OwTtY|4lVAl2N@LCwAjvB&)h7cqpoHX&Y+(4IBJj#dl5cb= zT1vFwWpgf7C^fBU3n2w`16wBQA|#VU4M|32AbF996?j{V<|U)d5$!EX`c$11Xz(aE zOeCa~LXb2t?veH&y>8OWxcW%irouS6M^Mv&)M;AVyjJ9LCbgMsfNQ&O_j2n&Ug6WY zl4=%-TnPP!SLFGg@B7{m-$RZCxrAPlC3KIehwy&ROQ03>P>-A!`j87{UKL-F@tO4^ zzZir;EI_LZRs43;!O?t|&7@JP;GUmB(esMP3e}De1#ksY=$D8%siemEIdRcP{tVXjui0(Ryf8*AYyEp zBJClBeG_Lhp3egq?MQEhxPyp~5)CJ0!s05+#0w$7Bv?#!ML1K#$Q>&v`H_9JTVo)O> zxFAoYK*%LoHn>^TF!@4OWhPb%b>%8MWz5k?z|uEKk%dcZMerPoV!2RYHiHXoD9QAiWTLr4IH2u~NYYT$!aI^n@w23rh`opcX4VbU|o< z1vep|K;RYrAq*g+PXrPTjHnJKS#6~VaN(d#kN`lyu$UAGE($u>eniAXOEwsxkSqXz zV2~Z0rRT5rMbZBt(`SE^kr`DGhrE+(?y#c}?Nd z7kNGT%!cLCs?CNdHK3A|S9s9_)M9EIOarPdi!?*rA24M^oOWD%BnJ-uVCY0!!aKs< zxb8&CAnihW9tmtPA3S4f{t&|PvCxMNkw6qz_@F@L!cr}VzftT%I)H($8izzk zGl=$t<&=SltQ5A)hl5Nt8Y%N2T!j(;e%}WrLu~J@Hjl>bz3?XO$d>{=K z1Sy~#L3B?FM+t92D1a21E#$^#5dkDI>x9E&s2IyQdxZPbWJ$Z*0iorbsG`DP1WG9@ zpSFeF8v-9)L9+PpgqF~OhLoZ!P2ZG#;islT)F(P>JX~|QGEpO%db{W$m9&WALj(b* z;3`g_ou5OK_9Q)uS``zCq7ag1B109?I1DY2u`UEa0xPu+GBRCCON!G8In{u2S}kG$ zV0h|IMthJb4W(jtg9IzYtA$N0OV}o?R8Do2FsvYo)WaQtn|C4+Q6h$_%R!X0uBBkC zU@mP(h2nTL2PdJs_8|;2v+chcqD_{dz3%IQ5&VD&DC6HD5~8p z5eXB7VgGudZ<{H!Nab6%A>EWnp!T6prjdNLDzlV_hy+zJ)VnAM&D9PN>3rjEY7xK) zW8)Z8TvPLEG z2+B(x$dOl)YqdXw=p5a2YZ0>e7$f_WCCrUQwFkswcKz>7Di$8hXO zgoS`Yi8!KryFqWm^;MJCaV^nWXF4XB2`*q_?X*mM9g7f(^f>-Wf-K^VUQ*nD&|dU~p^$Rc91@6-Wx z($r5bZ*peULSkG)QG!ksGFEFUjkldpb(KQ-X(8H2rl~llTMa2U#*qviMkEeJaXrvh z?lNrihEkL0YK=mO4C*fdLMdf%!dGy$i-RoJZw3-q9d7EuGCF*Qc4_B_1YKEwh;y(? zl~A{&Yf@w~A{INCk+>Zz6?F;h0tE@HXVekbMlA6)qKS`LCuh{+faJOwjp{MfN1#YE z%qu|3m@mazw5wT)0#AJhdvdP6R5o0gQ)gFE=`rF3vUtm@Bnv3O(ue4+6o`1*1GFSd zj4Zb?~HSF0a2GdzkIx;6k4K-BE1|AzVRDcc<-^Oz?38PkgYL4#UV8}>c(P%Wi zZDQHxRbKIYTAhy6$~o5o~Bb;1rEL%d5;j%0|1JU0evH z)YMBUIkhrllgknvf$(E;$G13)Or)T4sbi=OjLpP?)Fy4hI*Hi50c;Zup+I;ukCzgo za=2|H;&Ggs*eUJwB^95m44qF%K?SCB(*exJM_fRNi-;+K(s4{rS2~?hxk^9*sJ*Uu zWL!}Oj%-^^McE8UGLQM&(PM3$5(m`bOdQHe-N;jCCSzDu+OW={mnUjH)LNGwZGxW# zB4uk>s2b>qp-VNYZzGbdv}g&L zUm=_h0=qL1r8UOs)*hgs$hb~(n$@Wp4)LN0Ts_Xh4RtZqw<3PM`+SK~G@`LJW3KWLK1s2Nuvq3a$xG1{ewX z2qgq39GY`+lw}=f4zB-160#G(cy^T*^?IWoVKO2Z4F!3rDZ=7DzGq#F;2iX#m{mYX z=}u21r&z649jby3g(U20yIog{8ZPEW5v*iKrafjF@T&QD!fSq)nHm#I!UF+T@_QE^K^BqlAnm^ zE8?qh0HXxf^NP)xh1Ra0~c-^8So2y_??CRsz78yxjVGSUdowdgAXPIoXtj}pW;>x>2x z+STwl)B*ta&erwpibS=hhl8h1${LZ4)9DZw*F+T56%PQp)sO`Rk(l@y+l|C^U%)1g zS(;o2iuyoo8NtB<)wFMq72_zUBxV#yydpKVlujZNNoi45s~oC`?PFfmN`x{oniS05 z7dU2OV3(1G-UJ~nz|brbP87x7pGPI-Vt^o5>SZScZr829n~1BpTFnq^7VCm)2O?4Q z-kbGR>rym~Cg=fX{K%VtCn78{$wCNPYH+lD1r+VV*im#}V(G@dLNvKI!NrC2iVt@| z{NadEFVe2#3f_ib-l0{?Q!q7yxpz(!Hko_D)Q6Ldxu42bCMs@xfi!izvWoQRI(Bk4 zH_CY0Ks7E z3C2pAon0zXns!Bo2L@*02BMwT=>mz)R7;p}5a(S^yHw-94mFL102V%!h8<=WJ?tno zfLU@`MR!6LJG)uc^s2R#mu99Di9wms(4l>+BILcPpnF(pA}e|c1x~?YE4Gl3I50#j zfMiyMr;2vyGoSAPS!e>EeIJie?G_?y$N^byICL^ssZ|19XmGmGDT6&3`!qWhyD0RE z+S(jINWWC*?eu4T%^tg$vORD%ri?#AdwHO0aZ!-jU&()(#~8BV+xL!;CC zq?QmAn{|4FTFi)Ye9B-n(Z1IJz%J2f!{`K2D5)@zo6b6xrN(xRWeHNCi1Pwp@np3^FFruis8v^I`G0C6c{F4`2BRHtQ<(j}X!YZuTemBx4(zYv`zyZg(> zQ2GgUCbKv+&}-D(`SGvgJRTNwV2&XjH?%Sl?DEXk>miLQLVNPIraGqfKXGU_Sqai; zVg|yi{b@z^qAsCyD9}jStL#Sl6|VxORjE`G+b`M+b`5AepTcu|QcXMah-G%`D2FMG zb);5Zj&`Qc^zt~F1|u2r8sK@d`j&JLxXaB0QnekZu0=%$beyb~RePD0h0gM#H?=2I zT`bXjc1bQ)RC%;>X(Y%51nWi=8v6?h%(qC+_^!?`fjYli?$22=rPIX$nGf_Z+1>@0 zJ1>-&W3kVt$znWeizj1%|0W$Lrz1|RH2=VlliRppAt}4G=-+8F*6E<3!&b(R^(mbt z^K%F58KijSBw)A`JAaEs-Nkx4`+>kJr@gY%NnC?r?~aqzXqY+ZIU?qvI!?|Xxtdi} zKaZ2~UEujc$j&I_ zU?)a$I_Pn-P&0%`LPW7gO}#u#&QRsP??*GTHlQ{3-;IhG3^sPAlnQF8>w4=4aWy9f zZWuLa@qxs6K_tGYkz=Lg1sis}Asxef_g3T!&))cLE;)+%MJ8e%Hg5njZy3YVMr|cuHEDyFdh2x99 zY8Legji|)7!`QA2jf=+tk0Cl<%>Z7vT3mVQ-qj8g+BCm81ut<`DyZDmlMA;Bb^?*L z7`nl(4#|(m@gkfH*Vz3{42LfW(4pCy>d@3-LUHLiYF4h7WaHJht*M={y4jd|k=ZZO zBGx)or-z*>L3^<;#oqDI>`WbWHlhnnp;1C*?QUciHQ695CMhI@t` zbE^@x`4FV7^g|gCx-{4Ee@M5cptG($#J^yYyQ;cIoVRhKT2zT(UsXkvwCl^dy z4zM+KLh48Zay*NR3y$_?x6e5ffhz-c)S=m#9`q^aKn9n&xygx+8ZrFQ&D7Oo%u`v8 z^n>k7<$(ggsdnaoSV~k%rw_G<&eilpzUc#ec9hq`Z7Dj3bHBPQo6RDZS5X7sB=!DnfkIZCDy_ArTVl1ttpX{ODwfJjZ3>T z#Oj?P8kXAtbELtdagXjcrohKqgcRs3x?IycWjt`|%ahLXOg@F7?q;Jzk5eb4gz6#j z)|6F*jh{pSns@~mqlXzsbV*BJK?RAil0pt_YnqGlagd!a0fek|iL5Lr_n~>vnU8Cz zHfjMiQ4sa(F=v@L!f-dF&EIu1k>1Rzw6u&Yb}N?}tWaC)r#?R*U(%4i(t(WL=6Rnk z__Ztg_mH#B!wg2;bK55ily&bPakh8<2l9ZkEVsC~H)|RiB)>kSap<3PSGtsLd-i|6 zIgMQlF>RoV=Wdx^tzTzwo~`3hpE(nPL^ESSr{VYkZH8GrN~b?#Q-m@lp`+0C+EnH+ zGW#VoQCcf0$G!AFWYe&qBTQrjtget46^Ny_=W5ChB3*RYzNQXcA8yW%TTW(OpKV59 zQ*mveP}ciD+{|a5s1L2cbub=h)%7&_(eAd9Wt&%dt#{Ld4#Bg{HZ+or={3$_eCfOE zqs@#s>_uslXmr45oAV1W8tTALHVaoov4cO_tO1xK_Ru}p45s#JGreWOpi4&TEA(yF z@NExh-n{3UxfccN0Y2Hx{*ef$?o8ns$IZaZKiX^~xg8JI$2hO(icWn{o(31e=!y1` zRGpMrO$YDAbIrL3U%-WSln2(;GdWVx19+7NV?e~EXEP?4y$!}OM=Nouj6T?mC5n!% z{yy2PH|Le8Dx$Ne4mXOXUQ2`K&ob>kc)w?xH@KZr3Zr8>sD-=Hk3S2krU6W)(}qJBaGk zBXP|3hFL1GBd81qgE5TujS`^CAP3(xkFOD3;t9Lj!q9H)el4>_&(PEvNP`K!Y!)Rw zJlEW1w(iAa&5k_ENEw8WSjjk+%Cz5e%|_EWVAudi1-M>;iX+(Gv9%^Qf$beCK=pmY9ywOn@N$4!J2$U&&su>eM8ra|YLpP#WKjT9t z_Mr@uqh;leFgwybq=2lRF7)ELX7vkxs&B~}$aI#7$#4uYJ7op+COp{en4zsM%Mrvx zVGjIcGh>Xr?b=aSPa5WEEJe>@_eB3-7^T11(5bBot$7n@60cHP=xq?w9!C2lnQtMU^51Rn1V7%cpw-01}EA0NhqBpbbQ%cRUp{Y zgUtw*q6^6JP6&<8e$U?uHKvgZ7ZYsFKi4d0tCWK_MNfD8V6$3;suPmzXgl>+J4n<< zWNbWG1B{pzz-D4#Z|TxPZa0yRb~d|SF%I}xGiC`BkNOE8wv8FoeHD|?ZtD=FpCh59fkWuJN}KBI+FT$mTaeIND95^N&`Dgw(A#M zVSc^&sLp3cX5S8zsT=x+hO%oLohkD{puZ0~!>MrNl5xxU8{LFbvbWjG@L2La=vlIC zy{M|(U+1{ad!hERF7i0^dOS44)_BaT`?Pi=ZSOqM&fa)JqYtpD;#!S%))S!v0{8ncYnARQk* z0A7PC2dRP7F+$7#Uph*LGGcxT%Dm25I(I{G&bSOPqJs@z>XWoNyUv~^>zWcjErmMU zC$>Kh{G2nFU8JN~!iLB?-D!9&phtlY)nPJ+EPwieN)PxcX9xyzHc_E|o+aaMfH)XO zzeX*}*Zp(OWTMv7fTW`zRdSfDv7f!`$4`w|0oiBLCnSy+sn}HkCs*kQC8}DzjOR+? z&S9@pJ`BEroF&^^ZOVr|D}xsc0jgzhcG44QPx_%==^Z96&}-D#`LPel3~2m~m%rC@ z&L&jSEDRE~5yv~P65!N*VMo3=atOtVzT4-Vi3A(5cVH2M9^ffwJ`nvT9wwV#2*K>6 zGVs$b9S+5F&N|uah^Mzv+x(Nxy*W;{A&5rRb(74a6qB~qm}aLPapMC&=j`a7obDEf zbIGfx>2$A-D3mBSyNH7#e}+;pZ^>bf_98&+&OvY0sDzY~YV*Ff3`pd)!?lG_cCAj% z-JB)!CZZ1b_$vyE6@Q_Hq=;;0!Cb*0-6t9QsPDT)-w1)YC1z>wEK><)*Z`ANSU!`u6){W7~*?ZLd=*&UrC z4k4~Z9SYa+IydOjN$1BO1B=eY?eRg+@pX<8+cQfEsV>L2j&X5XYD+i83K=lwcA6m3 z2kc#b1{7&yFZT5qAInV6qJ`)9b{KKEGB4)jWMt!_VMZh6Zyni9tKLJUeES^a3l^2^ z?K!@#fT{Z@Zku-Csz8bR+(nA7Ew#6b+jwRv*>T?g5;w%@8%3&S2Nr$ zlAa_P>0LRH82f=X@B0~kCXRi*e!$##vP5E|DIG?gMn|;@%Mo?3Un_gF4)GZoU?^JF z+;xgi@$K%8p;#g8o`izyy|Qi(@gwxF>1pYRfga;)M76ilREWMGa9_%b%9oF6vF*`BOK^3-%Jk#>%$L~>HMuXDYFCr zr80_3`xXotJK1xQfp^#Adt4Orhxu_7=V({C?SQuH z1YLXf{4-@Ttw9+O;tYUb!MfgR_g%QfoL1iGMMS%at8qfe*# zX3(ldb)L24)SYQ>TEpyWx;xD`TI-BXp$@@uKF6A#V(6BfL)BQy--2|JfA!1$t5DUG1h8cq5p{8$-@%X+}_r7V2hQGHQMluUr)-W$+~zRolx zt?M)@uk)I@5lK6k+w#3S&u3VtlNnXagsa3kT-2v!5n~nO&1grS7qkyAu!bFL_Hz_Z z?`_zdIINL_MTkc*38*$y+bdTf>`DgP{+{RKzn#Z!U{(#*SX>Dk%dpC-MseuqhvGor z#6b1|eUAQT=i+!D&XC__%8ngFV>l;l1~AajJAur~&(PzddE@ZL_t-=%{Pr?YBj9s+L?xB*#t=f8I`zVJrh7HV7jfGF{zyp25_FQ z=ht?K6t1LH9~xXcNqd#kY5p`HhX*EnXmsr7@02m5DS3V~+yoxo&8Q_Qgsi~LjV~CN zuEgNd`@?*Q3O>Y(zZ{FQ&X5f4=p>`}n^y^t>ght4+hQHya`%*A+H1Wz*5~ijsqM@!H0i3(K7V5mSj=J@ zy+>dZ`Aw+Q`-tp8vq_`Rva6*xaiwdSwJ5W8ez5yCcAQ2ZIQRK5fQX_=_LxAx z)}4}Y)+9a~DS;ghtRxC;ZsHBcmO1bwm-rwE5R9&r%&aa+jO00Aask1VUy^rKL4sky z?tpQR5OOyIvgut7_7+v7Q07$O@Bbxnc@)l`@aXEYzh4rUsFZgD+SA^PV_(`nW-s*Z zTjJW^k;EQYFTQ0+|BLUs_WERBZsUlv+NBT2iXp1;RYg7c!9Gsa>1E<-T;9;BNHAXi zGp5;a+1rDCh$T@Uln3+!X5Ad@KbP+rj#o+to!{bPeLO;H{DK3)j(u)hINaX)V|^aD zYp1fWrFZDQ8bEANVwmmaxjwYSL~SDwX-Y3JNWH1&`s$qgw4n!iuhoot<6#k66T_Nn&en%Yk6B7y!NijIbrUp9>6}411hs#!5*wsW%aZhzYRw^c`u}M=ShRi5{#K`tuOvWdDCE2AqyM8Hx-D{2GBy66{B^B7|ObC8h_6Dm)=fOpverk{nR@hIsZ~y{`A{ z{V7s}!}Q@`S^478Fp#CWY#3zZ<+`eOhQv)6NCnPRk1>WXOQDf@dw@7U+pbsjzNH|}-E-0L&?|Lb44XFt(b>@;cCUT{mhozc!` zUn&ft_3^HQeBU0cCVHN^Yo~LT9li7=U8~TiNKR*19Ypa_-Y&ZaV{dcr9mu~DL(~8T z4$fYE(eO{i@yT79xrv8uD1#JGrM-VA^t^FGv)I+FUhVW~ z7bDs?G_1-X+h1VX-lV)V_kLfwXQiDXyZ^>LdXVNKpjqRiLM%w7?Wwi)4UHf(Qrvl6 z4(QDWm*gmr&I{~!8|HMwM=E%OORrAo@e4!B^vyh@f6KmcZ||||Xp`k2tV1tjH^?T+ z`my+FI4Oic)6Z_(}OB6K)SrZFo^iG2>~ z5e$V2KL&nA&mCH3ezs8jg8dmZ-OAJbC`j;#FlR`1`V4`jK?k!Eic$%HR6y%|&#J-<2ELpfOw zs9pG}WB)*3yYKBey{D+tTlZk8U+9d7fL(ovox#v-GsTMB6WZgfo{s6M6^PScG>fh&+@I<& z8{jcLybyBQ+ibMizz*u=h8Slb`FU%#HT2-Hq&ghp_U@%dE(uk1E%iJ0UcO|0qJfwY zQ>ga#oA>=Xs_)-F6oU$ShG+k|4`l86Yxla(qV;=!P@n(SJx95&fFuCycTCTIwI{nY zK4HmAP08-j=&Vsumnz1Cby244{X_D#dtHjKR}XMXPy4AjeB|vw-@EV2IlUQ`g$MNm z{&!+n;lh60O{stP_!I7SissUf&fD!dJtbx55J;V0I@DJ6`mCR!o#tP9w2_USsWG1HeH~>-9eZ5k-4csj-LkTb6c~ zAz)WuT+y_T#Lco}s_bDWXGiToD-xABKaHa$gwoa6d>-B-1)`J3Q=u%a}v);4m^Zy!yTbVTl?RBu9bZ1zL*M9vwtsnR| z!F^dmvWxA)qVL}X&;RRYcAg3QbWFOcPLUjGEa$_u2GVYi>)G-2c}4@0Aet_8HLtUS zb~?%H*yzo1y?noouv(r~(#|fCIp3b?_3E_V-k3Wy zKj`j7JSL;;>VXuLQLLXo>8|sX)5CAND-<1zvzT@?nd+KC@8Fmkd;Z@hb__#^ z-c6$C(o=YAxW8xiTuOk9y&Y#4d1S=6#nD0*+#1NbObkSO6#lNe#3p-8z?jkdgJ!!e zB9nfdGwZ60U#G?ldAGYD*x_GuWhv5%4cAP3D7w?J}WC(ULiX0Owv z1378VZw7kt)9!saXV$ff?jj{>V@sslG2MCg@|;`(@Lo_i;sTbMd*{^eE{0CL@U@@a&yhi2?Dc#5v{L_~| z3Wou~3;n?C#5pNa9|p?a9yALT%ADVm%47@Lv?+r>w?TFaQI6yqPs9f~Y3|VHL}E~i zc4!Zpsj7qNR~Cqe=%AV3B;>}AT3Q>BkJ*Ft`ly-O!avz7hv1}{oiUmzB{c!P2YrrW}O5XfeyZHlo3U%{QY;0 z8jjdeYU_O1WMuC9Q{K9I!Il8@_;2fU+05Z7=Q6Z4=Wg0Wml%9#RhPf&FSd<>nVT!( zM=191Id43gpsoY@@%RKhD^~Y**Qn22(;D0~a(iVRK?04MjtwNrsY&K^PU2mE zl>p4~LbVz28muUdCJOwP?Hcu*hTXgWo-u_fXefO|{Dh8SpUtDzw6=MC7Yj{w8dXRF zB47u$X|&4|juX3Q)I(}HOykN{*9f#D4@Y=C_+#FL%Hmc4dqlu#cG72;5Z&h4C58b& z57Dks7lULK-%+;@2T>mS(4l_FoBB`}c3u3#3j_UEVBDh7oz+|%h_XvDPC}OQf33t_ zSmLw5GGFRymVK$7L9bI^q5qg^jFfeuKCqt;tmFH50P*zsTUrie+Sl=JtJNFz&l3l3Pdkz$>Gu8e+Q;J z$ARq_@$D&w(b!b#Ox-`4tOJ^cHrp(sF+#D6_TMtn#uX#dq%jo89TVzEo1(d(pW<; zed~WdOk#odN4#Z(@ERBTxM$?Z(;;nVgF~}pq_GR8>jQ2W%@3KYf7xXLb&~~w*{i8Y zdQQ%gS4BH&`XJO4#i&L|p7dG{Dj91k1wXaF2spOv72b=hSfAL_>sh;_SL z1X)_tP3&3fKjY{I3=YXLYkPtVRWv)FJJ55u0}H^Y}Eb_Zvoe8V|h4&d5`^ zU4&dBDy`Yu4P)%pcI_dS28XT>CS$b#Q{bi36b+(tfKFc;{OCWu_yIBXVqFx|zSKty ztufp#yckO5i4);l5b)@j+%Wd^Tr%vABVQ{fMVC>d!P~6)bdzOIN~l)X#X3!$e=r%N z6};&J@d#wmju|xY_s&=Vh4jhCV zNwp#0%DzE34*kIK1Ef~DLa!i+vfqwkE+}R;@Uv2Ie8PI#9_S?#l%gF#en6l$lRR8W z)Wc)_opN>j4qP)qkpPFt6Fv+QC=-%UBu@%#wGeD$J7IVZb1 z*M`qdq@76rgB0d=;q%u>f6G0O&+p{IjFa^x;dUgh9&SqpNNy(EhGHgeF3o1LC^CT# zQb#7qa+oRM1#h6DI-3cFU|PV0P&$(kcyFsj_rRUg=brE@n2J@=@)i!_*N{l4kp%0K;qpp_va-Q98*&4%uWnmBJ-t zO)3?DPy#T45DlbULM(uXU=yTlDF-5ufb@K&M>0XWRO+O5IMIm7i(~?jAYwTyv<_=c zFemL0SE@oFQWE`0lmaPp=KPeGb^z*uPLOhGi9+m<8d+gUR3I=HX*K}9BZ*c>0Mdg6 zi$utfWsq}Oq6|K8NDXyt@gSa|rfR5!iV<}>9YJTJa{A2%E*^Uzz#bqBqu;h zvokC85iPEeyaYzwlZAXrR=vw?Mddd?Fn4MHm5yk3)+h< ztONK#1{OGNfCvE*DpH7|+m4b090!G{-2(+u3EMDdqm0>|)PULUw^Ac`)^ri^d|1*4#SC^H6>IVJ0|krEJ3geelJu&qeIRe(`a zC&)^WgglXMFtgf>9E^q+tH?5Ht6)~@XjEYa&8YQo!HW?A6SfUgXsHw=8i!`{g;hi= z3pvv$BDM#ugZ8%KwYL?Yt$V}PVl8G{oxNUb5$jOt?9FMuHQejA?#;HAN&^~w1Cwb@ z5>c9SfcIN{;3WX&;ffQrR(CI|g4PI$JkY{g7Nflhpay##MfV6Auuds}R+$JzIRl{? zN~73P!l2rJIe$T zAFug46S%a?r@zyEZD)vP2cSt}gi`PA97K2$=V!{0@xUl8&uWbs|E?&Qc@cPD_wNgkl7; z+#}S8n-vNu_W zoI)0qf^;aPzoU!@1}Uj>k$i|Ip@t@vE>L#u2D?qJyG<#FYi>uWrNyEzDH3~hkQRv> zTH2P^G2G^C&ulB+zHK|+>1_#oW>6Jwi?&C&2HOI;rcm~g0;G&U5iuu-+qR*JpwV_` zySL5VzAZ$7tx1w)HqJT+q(CP^IlHw) z8&Nknrp77{5CI?(AV!RGwpt;=Ee;4p6mrW}Z;QKCKuQE;i%1P{v#7n~Qf zXm(!kObT9104{tX$17?h!SJM%5*)S@BS6XlvP=l`BM>UB0vn)29$8QbUQD7Dz|ITp zKqwLfUm2P53xe7yf<-Tcf*1m^got>P*&9Mi#iuB3F9xVdKq(5J0Yi#KT$YKUbeJ!D z0bug(Ks{6V;xG~x`i6=BqWi*&;q%UO?MNx4=aD?5*OA&J{TZKokzPjHjg)@=_xN0o zwCDMk@EIWe4T)5EO+6oME`E0N=4UrQo7)^c>uoMUj^*6u1ahsLooCZXA=-8lkgWkK ze57D=l8~WfiAxMZdw_N~qn#Du<_e+_6Sz6S6+A-j6p)V1?z5XC6g!YCOC=k^wbZpxu0GAWH~$;M5n6=ECRO`sTUEM*0& zLvSjWR+dn7HwvXtD3Mp7m7cI8`$%E@dB(c#qqLe8UaLG`gO)*MN zz`{*MB9Uq(0J)8$tdvGrqKQOBk_$yrU&#@XvQd%)j3O!wp5iSr5n} zX%B%HZb+am1eGM})(5EaH~1hKA(3>n-jNipPXNGMUrsQ*@j>8VLkSCbhcVS+X$Bi_ zLm8W-NES-9l(=~e(h0#NKy#Ay;Rbj82I}O4af!0qkV192V38b9C?7-@s=Nk@7m9$& zKnRd0)CH2NOA`=_MvTNDT4K3E;PfK|yr))+)@O{BR04{GHW+L@OeF@PIy5Y87E%q` z119%33=)3&fhIBMy6Bm~>z;XL9bWnl*E!FG>x!RQ$BOWo0Lfj4nljc1PzW4nozLoE zU8z)~K0xgt10i6+I+p~BP)EQbK@Ne*#1g5JS0L1U;A=U0CR&#yl8xLWZXwz4$5k=8t>?rC*&*aod(Yl-%iUunuVZPTv31f$HrN=sG{q)+k zPd^>3O+LN$>9yh0xwQ@oB`lyiTpOWOCV3Rm9ZpusUh z4sEPrHW1YU!zuxkFjgf}C52G$|0GAfS^bMz6L;LiU(XG zge>!gw-3P_uwp8b+CbS-p#aL|K#K|rS;|g1l(E0Yr7S5Tf;0(PA&6a~8~|Qw*-_4{ za;F}U#t{Y~c|P@2^knoz^km5sPs*!9O3@R!Cle?KPZmA#RSnLFDe*E!pb?WgXuB&}sR^#HV4v_-1 z1d@*c!MY+eKfe04$D`Gev=mHl^}TaT`O`SF`a$crclMF|NA6bXa?DH1{`5+ETFp%C#G zfe?^_6r?Ch0!a*s6p{P_?snU4&x~h&9zWto{J@Sq?cZ-~ewq1^aa>*1UDef9)id_Y z`2Fhc>U!RL&x_Azt$l9w0EzBh=j^@qdVJT~`<#33z31%R{&xS5r${vac>3Fu;8ed| z7gM?z6`gdbgpPuHB28j5z3G2RCwgje{|zex1=~u84LzI;@N(`Hzhm|h9u~R*XyDza z#a08|fil1$Y|t12y93(Ve_UeC04u`ketS_&8ABxM?dq-W?GAEZy>$eQp%&VSefL)X z_WWCKzx~!8)#=-d7T=5GA<2?US|L%Rq{HKft{?f$KUQr~Ak zetRKgb*@qO$|}=9>JH#+*M@v~huF$;PfcsKP9a-uxl`)4$+JE|YrlB?Uw>=#!{2(~ zx5{q*(wmpwynU&9vx6Gw3#g6y94(Wmb?i@2^VM9EU&G(K)JJ(Qr299kOWm8JOK%|gW-z-;i`u#rmG;uq9i>(kgq6S@|SRP+$(n@nT6dh0Hze<n+suel7ecPrz7YfBsRuUBu>uXk_EMfv{VX0z?D)7GQXzi~nZ>SM}dbh_8)V05q7Z}h?G*;j8I zzP=b1Xjlp#=yd4MTWKgRrByYRgxjG$Z>f6&bc0zG)NE+fJ}r$3%C&DSgb{et(yU1R z`bl+^!D08tVpdvpYoJY#AxK)(x<6VG51Ve|4}C`}(P94x=VYX8-y((urbXSB=Rq?~xO&nt@F38?X1Tb+4Xy?bX*_O_dvz{+^smiPs|jWy)H>_b zG(LKjT@`*KF-NbpuT(GBukBUi+xLr&{!vQi= zyiV9RFP;eaF9!DF)P}COIY4mnh39>BFZ9p%FI3M@Us$mILIK7v|+nL%c&1 zl_JsvE|H4Q{i)&)iM{~DQCs2>ahQ7^Q7xzU@e8L_$`cjdai|zpy{*o z&prFxbK_@6&pq2cH+mMvA`GP3XXhx?$c&*~=_8pV zBG{!Hbtl2bYZ|wDV5_e6k=Uk~81U+)02GR1?hhcFB>gmLC8fpQrqk)O(`V+Me&*@+ znd<4LltxcK(^08l_R&y3Gyn86DYFl&zN@*WKKIPih%aIVAsW#+@$unyjAQ4-ws4lZ;iwLPO{viezR0lIA+v?y08^ zpRAs$pFAxOuAKVG=~JU8pPI;|D)UL0)l(hRJ~^*o^HdWB>H~ice)Ht$sVBQ&)=!=& z>K%%w!VJc2#<*TJS3lW5HPzCSp){pRtIllc(i|M6b&T*rm`yBw@vrZ$IG!khObeQ@ zCd7n!GEf*(`&1uXv4XAepPZv@OvC<@i!z_Wgr?iT(uGbsRz#~E5{N20g^^h@;HA)~ z;oynt`yJH8e*XJUJn{Wqic`p@_aW=;6ALyyF~_zGg)v;ET6y2Ei(GQD4}9-!_CNmK1CPJ`c=g>MKmIA(*Pt&Rf8g=ax4+YVyMp@fH0&qPN6=m=@09%! z?bB}~d>h6cNFfytzrFOGZ-4tczV?toqW<e-fpB0cKcXQlg-t) zrjMPRwRiA)c)O3C2;O61qzO*@*u1NXw_(UmUrsF4m7Wq0m0MNE`2lHXGVU=M~oM=;EUlh2+}OBh{fsLwB(X zm)*sqM^9)wbOKhC`Y>~GjKxlTXonc3Nw`Es@EvrI00M+ofTnyCnu4PxD+$FQ`T@1r zjzT`Yq@enWnT>!<5()_67)pnmF4I*qh@DgVN+fBxzc^RCPm%5){d$Qsk{^iiKq4Qh zE`A9$P*-U8k-3YHTs)+91noUS?$}#zp~)koM~Y~V01<`w0j2hl(KA z7k7)Y2KS?^<1wU^jx{ZP49S~5GOv|`!amT+Bg7lcdu+v|pp?p8k?sSt#s|!|DNi1* zF6=|y!}Av&e)z&TcRLTa7e)_XsA;(U@WO?Md3BVVhr0_ZG@&rM@bDZByHU|XccFi{ zM@g>YhedQ;_Npp1O(#cDUD7SDhr5R%v1??NQLOG!5!8(mynZNO$4uVRX<4 zr3=_vOnuSKTkH@OJ<{Dn3t_&aggY#@NCh07oYCN5Pl=Ps2+i)oytNEe#V+Ehi)|Xh zQhQ+z6WxU+4QVSC0AQuRa3cAke?m|+WXd$qUpNaVMNmN5dUDcxT32!*T1*pR4*8-P zVD>=fPIt=DQ|IZW^Yud~&OdbCH@P_f&_n0pEwT-UBF%X+5u)uwzZU!uSCaSnBO1?I z$SQ^Up$c0)Dx>qI*ixNWq&q(shO6_k7D5knv)V(H<~3$>|IlLkYq6IoA3ERAa8gsz z)IBuEzDBeTm9J|tT2nKM^mpI~0pk^X;OcZvwH>PML#I@Um@w5snx32=J%sn64US1` z$O;)hKTT6c&^)x1%Jfk{$s|%CVzz-f;ACjz8viYN#B11M?9ZPHR3baSc>bKP@%ic; zZRf}bv?NbfGdR`San8ghvw{6S#ny(gTS3tcp0Du{|F?`g82s^Y;a^1V@n$PeiiY(5a1; z7G520P6r}^E97YIyHhugEVD?XVYwKjgUMxXaQN*fjklDwk=7a zgOM>o(l?b&Y-MX5@#_4obJc?fPy_u_=ojZ&wo~Xs=pUY|+5QrG6&j!Wi0wZ)H~-+d za}VC3*k=ZwDu6YoEGok~K8!1lW-Bsu6 z2TvgAOJ?`rylNd{Q>xnU*!RC;LJ*6JsdI+y;5B5!ZhP*Y@SiOdTO4Tz^ABR0+(3v< z9-PBK!lb8EY92hLP^z{Mj#QotP~l5|y6zrah@wGsDOIN=TP$}t&>pq^!PANsn>FiK*e{Mf*?V+I3N6;i$6N+s_dxz4I zr3cNcY5xWLL+C5WTqwIII1cF&W-@IYL(yvy&xf{y$(BrGrezkC!WFpOegPdoJ7urW z93J*3WEIM2!^qurh(~xCLUr!e@i=6pWbfL4 zX5GM*YZ)2BIK+Mv@S{Ish}!uM$!Q!1*cL>Lx$JgrWM_nDymJCLe-q+(_2gicV?WLj zL(^BKe#Ac8$CQ2!?LsNtpFce38Cj0!7j=}fJdKteN_)^}=i(DX(eS85T8-1;o#bj& zu6BMJ`umi$kyiwK(hVP=e(d7J&p1wle8Mip=Odp@oEiD7^17gbrhfG0hhKh{+w6y@ zACi6;mQQp)=8r#m!+6TK!>1#kdQ&v|ht8(C_`LK(+RxBwd_bmUp@r2hoajt7J{0{Z z^~2lhNv(vX?)>Rea@UX zFMM=fyXZSU`Qcg-H3_J>=FooRqJi5)wuWmXU1nmvsv#gQ+#YT&%yISJaNXTKd@8>J zT;PJfp0Rr_@)cX~>j6T3A-TXe6#0Bh=@9MWlD^Mse2<8)6rrL-8km>aUTCSR>$jEm zVJ^oh58qyZf;l;hI(Zm@{DuNwBQt)7p)S9GoK#ZTkO0w?w%-#>xuq=xViVu3j>9ml z{KC}vy~h{V-|kz!k2C}>99;{Th6}JNP~s_SZ3(k|_(bv5%>pk5O;-7`1GY$7n(O0R zSHNm6oG4%?NXHkV5}QdeQ_ba-yZP2_ZIAZX!jyN zVen12Dx54&FV3M*!@W6^tD;_C|8rNC?fvqf)Z9p}ZSD zR8>yS7_zR1_Tovg`lj4Nhu^9my9Rv)y$>CHYr^(X=m_e*^*Y%${8n}mW`;h4#@8DXi5E}MscW`Vu^*EKs%%uf?c?ot=MYeDS^zGD zn!yOYj!1CQKfY9)gmS{IzB>uI)R{gW`^TptUJ{XJ4nzZ3-{z=K^k(YV^ZzFShMNw| zQ1keWC#v80O=#zd&)I$iZ9)8+`y2c=%l*?yL-+B6H zPtQN~^wUq>q4Jwgf57(V&~0e*=?B^FKHWXnKi@r9J>NVx_xy9u*Ref#u6uq8wa+cW z3 zaito6wuNd!NJrD>ZX-FbdU)aw!O&U==NUs&Y!#H6>Jba%HPU;KGW^*@=@1$RCjW{+NKUaMX`guH*l+ZFbpDdfEzyHVyo170^? z>tF3(o3K^tHst=R*Sz~+JS(ZS4^3YC6iICzK?kpKyT)tb=1Z!wC$A~`IYPh1UJ#l) zQjq&6E>%C^j;9}7`T=)3{h+%v|AR}He!y)>P!w+k*Q%}k4-PIZC=t>{#HRMr=m*?R z)fYKsD`fhRUDPH2TUH(#OC|Db0dMy3>mk`84Gjysl63PcJdKpV7O zXM=|KA@2EN-v<>PSvDI1w|)KKCS`4KGZehZTh$Lgfu@Bz_IIEbvh4ngx8{HN)>~1n z-Ua8|%u$}OAH4&M7I%vXL}B!kcedkn zcTR_<8*P=yOPE~-Z5~t+Z1~plz!dTBO}eYPtWw$4FLCPG*mAfB9n? ze2QXR!mw=&9XqyF(0eOCTd%I&h7Q(ysN(6U>e|iNAF-Xn-C2*vlcrIvu8n;dsk_!t zmA-%u)_tHW9_w0{*FtrnpJ72Ccc3xPE>+h)gm$0~YH7{q#SrMX=C`-Dx7)2bc9X4Y zyMbz%TiYE)=`i*^O-Z4%Rdl9XqwTG3d$hGZMQoay&DI=7)oam7JN@<&ye$p4G>pSz zyLCqQ@S>p`EG-5X%>ty~?$HsSx{W@^TW1H=qAPI2NPm>DrrJIj+}BV?c?Y^fTR>k7 z-$asZQdKbk1u^ISO>Fy?~I};{T@u^wNZon zh`r*|_vRHzEm>j6G<3GSj{soVtC*R|eHT8`L!Ny9@PiLNY$@)1(0?dv0yWS_ z*>pgWhqsZu6{YIKqYvgj{NTge)TYo5)Iq9rsj^GaruGAEy${LZ0dZaN!kQX7OEK;7 z1bm1k$Cf~5wF!sXs=@dv`#tE(s55iIXJ33e_t~eP?Zx(x`q8KTXUysFnPp~JfbPKg zoKgcZTf=A5Pv<}T^wZDkVV814D|16&!8K<>zHk?yo&3{zQ|(Lwa6u&7XpCVhlE7C}>vm33)6ougz(9p*j6&M>#q=Wh7A37G zF+WtmGbPN+gjv%Q8JX=Wut&&PH88_ADYwH?z0>ZG_V$_hYkzNVzui0KZa>~k2)6&t zp;GpHH1TTpnNMtgvd2_r?B{Llurb=-n+6AqQyNbwj6uXP-Rp>XwDuR1-C?BJpF^Uf z?F`I(v#)8&<_e3J8$?c~9_4%H&eq;)75 z+CmtKj4G$2e*dRO)!{m{c{FCb1#Lrz&~1nr57|1k;P;@LM;F-MI_jrYJ%x^@Oxrn) zVm&=kPiuOw(li(AD*6ZmU zl`bQv7%sJ=efJZnL)T1XC`_PxSDUE~JC%gd+%+w2%(?qv(RrZ%=fA4a=pT$;9z8kw`=jr(e|Gdp_2))^ zd-TUg|IO&%9X(zB;nDvz`rFmNI{NdYr>eg-`WHvfRX;@XZ;pP~=z(en?sL@#)!!T4 zJNj2fe|U6X_4Dcj3$ z{e^0M^dF5L8~xVkyQBYQ^v9|Ps{e5Gdq@8zoZrCmAFuv;^>;>p0QrAF`(Lj9M)lW6 z|I+Ahjb0i3rP0ai-vHI$AH9X%p8(bA(cc|i8vV`cA69>5^sm8xZ1hLb{&4ib=(W*b zs+#JrjsDu``O$aa{@bHJGJ0tA_~^f`{^#m9NB_m>iP3ke&FasN{w-`hG5Xi5e`j?6 z=#3?a^NW|Nl_!R{!znkBxqP^y=u*>eK4q8=V~e@9_WX z=nqzZvbsF_)5Q0Gjs8|Ou6}p*gTx{lU?H zHF{}u3Jgz={*UUv9sNFX{vT9-1e`CAeqZ(A=x>ZJki#I=#9~T zSDhUF+0nO0zrT8VbRL|4ZuBQcPmPwyRbf>Mzp6zh0fp*Vk{%rg^!soiFF4IY}{FrZ@P4 zaifFor(LeE*fUEE^U1U~=3vw}_|{QMXBAP#H>xr3%?&K{i18&U#Ez&j2Tlk!;X^8L$zJQp}yxq;XiM zX2xcAy70(%$Q#?!8%ya;l|C%=H|Aj>%on(DYLZTir&tnjd*fu`WC9{#{q`g+l!X=##J6JI6CMWta8!_h(Umz*oGiYQECZz*n9-bQnUrc0vsVHXh?6H}HY}Ia= zzsJdXfMov2eB>*tC0r#bD$s&1ZS|DCX*vr01QwOfC=t%yyEj@=GL2}@UJ=-d)Mu8U zE_)3qYC9695xdg&6e;z21={+C!!9_1qP}rzsBdqNv#Yd1Bo4tG8iE=pbE@yqRB9M& zBp!eIOe&}_P?8ZDE(ZZXV&*0h8EpCy{v-pVWKx~c$pb8tK?(MX~5S1WYMsVDYZ=T@p-WEB;_k~RVgDMliln{lpp8E!MVxnqI<$YS}-|z%$ia~1v1Tk zx7s*1aFp!qmF(5SaHW!?XZwc7fJul`4%`BYQW-tvPzzYy_EO1fgs7)HY_%ulSt%_G z(nFe~k`Vp)AkhxLZII?c>bWmZmvFU^DDptalapt~E>1GUQ=Hoi!-107chD;@9(@J& zIJE4uJVrBb+hzx}~fsx>n);Js3;pVk`VE5(36XVf-%p=C|^7!=t5Kw*q z3^>e6AE)>@W6dItI59E1rf+o5?IXM_`PGX$}yC`f_l@hbZ+t zTC-CNAg??+&vS_;_Ld!69%zmV&v#nSvv7{t06Lu7#aLs;Q*SwuVZw9-puBor`Ry$5mqAbDYNXQF6dpde%=BA7=B8cm~{4gjNOn5OP z5lHD#k6BYZd=|UcRu2E+;3$VbsqtVL4&?mU^=O!SUK_@^fzB>TVl?T%?B)lsmmY{u z?9lK&452)g#MKF+(TaeFsRu<45V1-55tsQJE+b1*iWrzqRP(%1CV(s;Ba%9zDWBrH z$&r?GKk78kcwn7|q_M|^ca9at2<#j+#@u@*)2mykzUw4W`pE;SjCl28AcW>|`hcvT zo*vM6(BsZx+2=)rNb*p^`aZ$k-KQNfd3hd4nJhBQ#(5|E z+?2(cO@YH`J?;<>=sY|#%jTiMmz38^<{n_PYqyyx)%FTyqW=-K$@b@Loy+o5$aya> zZ<_}v)O;Vh13AIw2hp7qB2?DVXwO_Pd!@90YnzXdEe>P;wmHjRKJlMZ{CPucTS)M~ zPwu%A-C76%4hR3M;@qn^DJ}mlDT$vgE*)s>C?n?%xvlu4NI%%1s@Ky|icMJIc#1!d z=x+bWI@n$i(AJTAq{tlPe@qFgi0QxLqsSQJ3J^| z$sR|6@=3@-Scm4_LzmEPZ`8hQEuT!j6HC!RQxw*B;ADe6^Tixb#>pn`pHn-SXKpcT?bG&sj z8Em`F(?vo_pa+pI3}}ipZW1#46U7ejH>Jteyd3_*4Y36)oAeota>xgYOd=aK5N;l* zut~#cb8B$aZQUa;;JHVf=~EHbuPF4bQTf*Svo+c$TW5~71{CyB_?^R)!Y3mEZrboo zv~+JcoQ0`eCPvitR>r|miUgu6i^p&(=#-3jZ;b)h!mOcgXs~e%W4yVTl1g-&AYyB2 zUI~piX1>_k+&ZH10D}$ty%0Z2(Pr~R5o$|mD}*KpYWr5~iL}@fjct0X!%!RBI?!TE z$*n0hB@dxQSa1#Dq>;%cebpooRr*ba886W?>#seTKA2&5Yky{oQ(g%7flfc|CKAkQ z+cPsRlk76bZFjxhyf;cQ{Oir;*TX?>Xbg$#fTyV{mK(HB+MssuMcLpZ&BQ##shBRn(r?ZoAJY>D zHvK!JF;fB~sq1!gF)g;6_l0t_SQ4???SMFwg1E0%8^~(IsG-4b_$^k2Z}V&#hM9VNgQAiPd z(dvL8dNqxn8(Acq*GS>D3PPTy1%%Lmt9Ya6HFk<|575S9 zG-Ir~h7aUVX)2jWVTLq>Y!hYf2nw;>7juJ%V2(7Y1@1r!$-vfZENRo09l!v808byG z6DV=TElVgSl9b4n1NF6Pn9QtPFm)UErct(8NE4`TObsP8LMZ|j)ikp;**G((3QV^P z7KpFAc6u;}ssN2-Qu57I)U@j74r$(nrqBWO#rW`Gat6C=*InB-n8Y6)BSpXjajq3GmG6cZtZFn zxpvLTvB&V4irW|OY3jy=-7qHDn567}%;Bwd`WJRn?h)(Z2(QOObuFjR&bG<=IG}r9 znD?DA_qR^ccK{2V2NcV!*v>t^ULbetivfvhJ9CvcqX{79<1PU=iLk?mI7FDiM@C4B zcfP4AlEd{T@GI4DciY0+Ixj%2t-I@?c5S-et&!ce(fS&9v)O{`T0?8IK3b#UP`&lF zHM#|bIm%rqpTwB<*4OWiUDS}%bcK76?U4KhNt)UFY3 zaTSRSAVoOQr%NN3dK22N-xoT^@nR_AYH1s~<8--ALWi)vf^I{fK^>&6UqYX* zRcp7e&aYj)x;D8=Bv<>jL-sXvbaheoRVvZW)a7d@t;?k~rKarLtLlxet~FN|3}a1Z z4XeL;B1~vwC^edutG&t9GwCDDu8ptGQLv#2vy9oRnAKbt)P~txrLjw3d&t|&9O`&v z{KUQ^E_p56@yxrb$_if}?hldQWk1#28Y(GbGaj5F9Td)o?#${;HIJW|vmJpeb+&|D z&f;EF4zJ#m^R{1ME_F){%EKJ?VIpUU*PL_Q^o#Xuq0D~qldYqA6NQqMH*q4d& zm8X^y(}ykL-77n$c8@J~od4d5=KCR{K0q`vXT1oienX{ru}MX?F-O03XT2|T?Z>?N zHVJJuZ@$f9XY^pr$?Q+xWye^Ua$Z*;LkNKYoO$f8Ot58&V@Uvma{hhaj4$)9TzmDK zg;}7cy(?F$Rp#^$ny^1A<-;reDzUHLf?8-=`10-qS-J_0q5Ufht5>e9uGW+fq2|h> z^(!#?)d{qBWnRYg3aNmhhBo`K`!V|kq_3dYuO85{6E;v;y>f%1E+k#P4+&=X${ZS_ z)ho^FqMlZ-9IcW-0)f|3Y*(4GfAvJRMPs|VWKCer>ZvG{3KneWR?k|PQMX!Ss9QZ5 z%_%W&xx;p|8pU>X4$Wxee7%YjIkBc zLmkPgk(ML4we*wL14VVW+W{Rl?8df!YqG*)3P$B%y+<7#gph3ej*=7r?3>WjyWbLP!p{)gNPWw2I>s#fUzH zl6mRaN8r&qEf6C=A_ghB>}JYcaQanl_+RBwfYk}K2OSbmvvMNiUp=74vIZdId4tuX zXs16`R;MdGI}nO{h}g(;1Q;1a+m(gL!~tBMJ}9jkQ;VaQSXYoIbv$+eg;k|_WWt0_ z+4VCVIyhWe3{-b{gbW2(&(BOK=28ZHdne3DaXR)Q-M~?dZK-TwQl81fg24z^Wg&{ zBBF=FR^vk@zEB(%PU`*wp`bvS~-Ac zpqD9`!fHj`I;?z=t9KZ@4THy2ZBXoUQIoWO6#ATxl;5TD#pQ(v`*X@76#`mp@1T1W zE{<|}mYXo!VOf-FWfIkD<&&~+E-x%!<~6xI&vuzLQslzh>iQWaMFW%3r$(i3>rMi)E=*z(6AE&pDfq$47_ zT=HW}+KQ0Pg&EK(Ly7WYs+cS7@kA7j?n`Fzby9PR(b9%zme#S}EiY!nWO?3#0oP&X zKC5a(d(k|V!kSvL$+z}e?BXpr`cD6X6i1gG-Y?%CsSO;7$dSolG?z!qmz(5g z56r>u5}mFBb_2|DT9v0@8^|M2EGb{rXy-9<9+T{g}U^F5x3D~ElUj8XtG3Z;)&auM; zW}a*$^%xK;J!1(vh8|fXpjmqNqR7HZ>C=`5y=j;SOC9lWSZj_(My03=w(;@_5yKF_ z_{=q3^cP!q-Y7vz8*5mm_a(TpjN^i0>~~mptLEUVJ9AirNe+L2qRHI zuAOS##0|!DH6=R-7~^CEa63-T44Jc=5bX_O#D%%YPK>@^#+Ut``ORTs-t^d}3R)#k zMMLY3(9*%?Yv?vRit`;%`*#;~n|^h>%z(C=y5m8dMlzToml=NYL|P65lP;=RWFDXq z%DirNO8<%^hVZ*|qj6>C4suwSG$A-ND)xq(eRD9RsTG~L%~PgYw`nN*YZAWf@3E!q zIYY5u>5jl9K;V}WmNTJ(@TnW||V@}iAKRMVOf-!!VBhJLbsw(kms!7d@^1h20*ubDhIXOg91FF&Bzj+k;TBx+nxhn8-;_hpL zeR~5f4GM2RN@OFvYmFl)u30q1(Gqfk_$11oCV-D%F!E=DUW?`BjnP@s6p4&07S8K% z7+G-vGUzFxlLLaWJ+qQF6INW(aYYqxG18Yax8=HtA58s;h%Aq1g9J)6Ko_f?Panv+CgP@ZOwtOlt70o`t0dOXW}16 zfpX^1QNYPQGVB*gGi@O9_}n2ymh0uyXsGThz5`iFB$=N0ifZ3X9`cTYhQKmjg|%am^LvzET8HnG@}@Ze)kzTp$blWXaJa;Gp7wG{$7LY+h2Ntr zz97cY=rHE(krU&El3g3$c1=}}NYoAtktV2d_3@}=LN3nZhO{l1jHdZah? z<0NNa>o8ArIU2dvzkDik7wL=Np%A(I`*_FEn!jeCOk38PVJHa$5B?AXK$B5pGk!~m z(?_5jx+70W3Y{ICqGhiMpC2$n`Z50_cTgP%eH1;G%UI5_nuj15;uACi@CQPL?IjX4{2;|ItZC6P$*;>aL@u(k zL{Y)c-_2Bw5f?`CXD)ujMZYSo5 zCFA~<7#@oI;ulqut`mOzUG}HQ;dj4K%HQttkk8X-bm_PpPmvRiPmaer4*WsaWSq6= zE3y<9H~i>HgM%SED0`SVL@i6b_-HG~xd=)Jnc+CMhl`R>jl-`)%yDk^;>fgP&4JG1 z2ghmhXP<#e3f<9WS;2%HMgct>@)Q#86ic%MteySzo2QFBGCeos(V4kD{;^nWv-4&S z+dN(6b(!ws(+=s2ygoInWY3IVq>il&q~f9PXss z>_JW+i5MrIflaQ?1!_VVAj|tD@foF`Iq?!{hMuOf+lE1xdm;BEakv1YAVX5%Afd!K zgfWc9a*$+)&;B(L5PuYrHa;{5MIDGyYr}AkPhSI={be)!tx--|5gVBvu;w2U8t`D5 zeGE|UBJIlgA4*b5FaLGnyHvzhU-lxw)Wya#li5sUCMteSPXWHBqA@#cj3EE?F*6`@ z*p(RbZkx6@4+F~FrcyW4{ItC`t$X<7zGWr4~ppX7hhho5z>=LsnG-Dl+EMHgX)~AF={1|MJQfA-&^2+kCK6rRa`(5%~AD z!|U+BZ$11)+g?5?0FbA{;+^2z4%(f1xw3 zjM2s+xuO?b{9mj>{O#+`V2;7=W|F2_RZL5KNLZ9g|L>Lm@`KHo#jG8|DK^pbAF55{ zMwmG=!-i(~ERH(}1f6-$|^b8HwumIO8Am&*|J!eO}MG*xawpo&nu z_?!u=1T3IP<>2i`wT$hyd85bEasvsc8|NGtL`%p_8 zvGxCX?(;EAn8|E$LQ}{=XW)6;f@4=)$umsHLiS`P2O#-xKW9^#&W0mFT8PnLA^SQ8 zd=4{$^zMv4drlh$l!uS8+gWknKn`rZ-gU!6SMH!dP^7&hIbPYvvwKcp+8TiwR9Y72 z5H;uPl7kS6D$Rru1|teQ$8@5RiA~II8sgHR1AdlW*N+fTp&)e1EW0BxSg)h+&d9(Rexx zSKJw)9mM(Ogo~brxGw}wAOT^$ayBdtHtV=oCzLKTQ)=A9;{7fH@P?cw;PQ(DWz@N$ z2-zGWNaTr2PdUsiNhW-_@y0P0H}u%g8BsZoY~hEm;;mgdZ4P{4*%UcsV~_+_B;N7U zz>V906gAX5>^cKUmf8_W8p-j|5_+Cx+m(CMiRz(|gDbI>gD(fCt;0cOhbcc9lEk;S zu$W^t=EgOajOl)bj{#BiFwC6Pci&5-ICp~$M!~I1u*B_8+#psCfV`_IBj{J|N%Ii^ zMH}zFTPnIHOttvE>!zvWgUQhzgFna#3JH(voSmi_~6yF&FzvZIW!j5xINZhd}j~%J>(`0eqUmTWXJr1-K zs)vK4oGtPcN){aJ2|#z29Tagpo^DGhwh5mf(15iMsh4BH)TWKhYZ<8GNW9DCnrhw3&)NRsS6UsW9$vdp4hcT!Ksod%|Jl&;e?t2)U9)m#<|F9V zal-Ck<}0XO*`YylK4&4A^V{qVXlDf(@1Fce+{^gsiuXWzcO#;!*j?R-`Y+kO6eaE^ z#ntL2WV5$Peg(Y;5l*>hGuyn&6EECG=?#*3^JuqnI`6mSmdlm6!IF-kq|Jl8vvatQ zlu4%*4YT8!kWM7R2#R}sy(=_t)l9)X(!xF7D<|{j&$zvFxS!OULb>-lZyx2kCq*J= z4jcTT*Q_iBJMMq=F3%1!auDYotU}0}KtpA$op?=$8%oWL6hkj^WsKDDpMmYCN!gMn zZRT*)(h3-58W*Ry0gwG72=6?tGYE@mz!(FM67|acX@_kFX_^N3#Ruo7xW88CqP1@B zB+jC$W(Sq{<1X8DS2E98A~Gt{3?)WWv9I0ilXm6IF%UaEZrOGWD9XFo8xRRK(PV0x zm9v9>WJh0hraijJd%?Y{8O+9+&NA@e2P%#i91a6c49&_Z%w~q73rYqv6z*7G;jU{e z2HE4BGF0H5BidARc!rV8U>PW#_iHPsbw0FHD-M7(7bfyfX_0V?cD#l=$Zb&T|P9T5HelfTOZ@VnE52|4tQ_s=lmSfvd>01=FPs%=K?~so5kEviVX3Q zr)dSt@oCx2=H32rlf9`^EIe?5S31-Y?r{_W8i|NnF_xX(l-<~}=k%y2H)z;(Nv4N5 zCNauU78zHGGYME8v+V57L9Ya4)n^~XJA3v)CSPmv=?3jiXb+^5G8DLC47?s#gD=Z= zR+v$%E`v&AK6()8H%766ILDuDp;E>n!d*`kvDtsVB$nETj2F*+(HRY&V1t*~GCy_Pr(7`GO<3SBOH;@mb zZ#ZP)`H^f5J$t|iwBgX3MO}bL{{)h1RyS3I0DJWOKe?u0F$quHl+AQY^n<6AjKvimg0K?;C^V)a85ekV+8CPJ}G z6_*UdB>uA0Ex$)c+U1A%`<(qQ^t0mAdY;2?Qu-45thAITU<9a9!@0A1n+KGDedQDO zcc70TlqmCTTq)x+9%iD?d622Pat%6KML!;-Iw((Brx8>X%fbl#$b)7XhW6uOGM)sJ&v3qS%g5Ks!&nyL;W(Z<^a(MI-i&Q}H>$K`;&^(G zcm-p+rpM2DiAYzbA)j>9k@@57gvm&N{wD^A6_k4n`PiNH#IFFOEqx3R!0{xc^4TxL zV|vZ%X?W`9Q+j%x#cpwUhL83P+x`oQ0iI7Y`oyBL_XMU04lvOf9RFc+FOqQ(&%I?@ zIXs9pY?)>ALh5pa4Dr}*^aYiV&D|SNXB#+j(G-`(Q|aG)bU27Ka0L=^hFUy4h|p5h z;NRV`=Eol3d9mU-z2_h!nJC#OoIot|K}EIr$Z^VvL0=(v{B+`3Sjl#map^&b3>Nl0 zMi?St`3iQ+Go6{>e1cNl5T-3XWcL;TdJnPD!HqBG5) zFMRPCaAlP%W!i>^6T>5T9mG8H8vHo8$}y%SAHN=MWH^GtsYAr4FU>B_O=459DBj}9 zr!4v03hwb?+2u$#A$N6H9)audlF5008fqvWdr@P3bR7>c{hF#9OQgRJ7rOrw-2 zMGBaJLL3L+i=!<$!tJk|oLS__#KCanZ(K%TFuOeJqA#ZTQ10YPjD^I+)&Z0`wZ!pQ z(E0eTnV$`VJalug6z2FCdUd6wwVZ*PyPgrY`|R2wtjO+NHM=$*#VrXs24%=S4+Cd9 zO1?dhCX8XEkk=T%k>`L+5b@x#8TBD#%~%#nj%de1h7@BZhYhLB@DZ#tUkSR+gw6;Sf-J<-N#+4~*YL`z!Vz%ei7O8rp+=O#RDJx9o%I z^%Z+&FSIu)nU;?s+dmv4$Y-UmAeK+C-=BHF7bWrS9D z<@ZDp=hlPICfXvD%xCSS4qZ;55%Fenzfm;ORwz^4C+>_%j*@1?al{8lNo;frt+qtJ z+5aH>)%h^Q;lSs!4oO9#)2ciwP;gF*;RvxibD$2v|Fh@87*gzTL*I2yE=Q=rNI$h6!47<`dePp9a0bgVseAQ^o{lG`YTynM<@6CT4c8 zdL&&fHaHQ)v?wtj%vE&a0F1d*kSJ%&I%j(kMjWx3DdyXWiB}BbfHIwsh{l0VL~WU3 zB^nP(HXZGrN+Q&Rmh-nT??}X9UWVKlQvhVLpexL(6ZyDug(-usd_~Xf7loAh95qd( zIpz6=QiyqXr~^NbPeqPOu}h78qL z50EfN({QBh5X;podtoR$(H0|3<7s8+4BFPVA==h9pXW>wIye7(zEEK!MhFKL3peWVF#9(^TZp)NbrvjO92G?Oers`TV zEaT!(V$0#cmOj_d62$!?grhJMcLu9j>d0B%iWu3 z)MJ13bkRvm;fo*)8{C7<*hkxaDISb);}GGzOkQHpm}PzYHce#!55rH(oGfj0%-iG4 znTK?are=0(iDO2wFk6z4{fIcsoQbYkJ6l|3f}KlFJT?0=z1%c9-wfsuQN%gv+O?d6 zj%(GDc--Y1^AW86Vnn4ahnHs4wR78*5tcnQC5SqloicX8+Ylqnx$VXljVDi510Jym z_pZSJzF}aPF#R}y4LqmfGh;%N+lN#6N9mwlyJr?iU`PvCOjP)vW_)zCHk$D6Aj;$= zLcM0j>hPS&&-wfkg&{eUUkNMw#ck$n2XmUtNdQe~;LT_) z>bQ zBq_z*mkR9%W3qOtO!kN%uCdocm9sM<-LK8ttV0=OhG`--ME}^3QfeukLi;x9bS9zH zI3}@d*Xc!C>$MZbt)_QVl*u14=zNlTsn(gYk^0Qr`q~bRW^DoeHFQ!)uXK{uWN~;} zq;tarvq$2YxiR4ths<%fes5%EV63mz>t}-#a!4}3%FLD>Q2T@%;+>KKAZpI3;D7rk+Fy(dY_h8zv#Zo+pstQQ`9L~ai0S!=Pl(EmWFQq52cUTW^8FRw)%`0f|=`vz1AYJ!^Ex5;p(Ux zTCn5Hta{FTq0ZIM`Vu0VgMT_oVVi7_=nT&8&H;E|5y%#{wc)06TM{Oy))`xWf1)fZ z`UugqiEy)is<@^h`^@yjQGhJd;-*TBpKkp`F;J$doyyPyf_C&U|7y%{>(sEETr&gZ z$TSh@tU*ImZB*aC2w=(gZkTR%d0m<`s{9#c&J%9O%PUCY&J z$q|L$myWS8BqNGev!6_~(AArkDPn)6BlR(jKGVY5ZDgaLG@O&}nv@L0Y-)_|hC?%5 zts_RfAtpCPW42nO)U~tLrd%XR!&P_?#0Su!9k?Uvb! zhv9Lw{uwhe|BRWKKVgsdwcG1Ik5V5~Pk%`n-I%x88Kj+e`b&^h*RUG%P9Mb7(BKI< zxgV`NY4t8N&bh2_qDc55;6%^>XF6(N!ifo}IUvF^IdMX1TbwLf=gb40lV%T7Y3q4( zZJhwowh$-|vA}p_p6Ou4Y}U>%?flxLH|Euj*|*ixzWbbznklalvOd7Lvwm+(gIy-K zrp(z-6pS}2H)oS!t3XymnPCxgZ#zG?(42?+uGzeeT8Pf(orzO9Y-a3blJC7@ZsO$I zP6=+-8UE`_lmk$GTpSNV?K%@}`yw4VmAEy|O~G@<@0k2s3rsAZS(X?6MeBUsIhA=h ziD|%N8gC?q$-kMT9&IzK{5^UrZ@lEB4mQqj2-erm7?9D3&k4!9Kw_U;w!_02lh_YqDn>%Ony#M}YMNkc?hPbIQH}&B zF6Uq_ymX=Ylyg$^7@To5gaLeB16?=Fgf22_L(aJz2{F!gk+>L>8q|ps$HyG)2$jK# zb$ci0XoqcJ?X?rLkk1zUu|pj}6FTIf#$M@AGuAjSea772o>c)fiG-sw#__t`9zlEc zYq|-8VKh{or9IQZ*@8xWP9T{j zd0|q-F^sOQPaV?%!2D)7#TQA*S2Q18YYClxukm|(29Zl9^b!lbIfSvk8v$l=?2_8P zrj={tYZ%ed*bWHWlkBGsG~s(vgiC+vA(K?c5h$u_>nu1Be%ou=7O`DhKZLD96E@1J zr4cXLKLE+Cz;Ik|sSiLBpGfy-_>JL|F4L{y8?I`@KBM7#LGZX3%`~$VLa-ENX@s!3 z&;C8gwxeq*Za^PFV@OFcuz*68kFII*2BhRy&`oF$+PRikt96!HSpNW;<&K68#5cZl zZ3fnFV6~E1BVyhaC)#VLT-d?awT%x$0!1tM4r088dXsDbuzEwkF@_lBAu@Py%?Hbe ztN<|qP`{C!ut%gDUxfqL+t9k49f(LV#j+RL7O8e!HzKii!E+4>j$e@}W)tb&AbxBy zqBcfCj&(mmU|OPO-HHe^EpyCgu&&CnWRtCis6jzZ%K8@BGIiaHlpvDIz<(c5jgqnZ>364typ4p=UTRDdegjE(CH7 z>~>Y8LVVedKz89YBG6~%wh#HTAPL7K4JN^kwTCQo%7M#H*+3Yap$iB<{9e1p=MGlS zBAmd<3TuP(nBY^4a$D9Lp#Rf%89pBw(HmhX z8H}H9<3s|W6icHZ2c|F`o~fS@0lWrV*`uz9qP=fsLw2ZTHLq=;5S0=+=Mtf*5WCXl zrYJ&XTM|`m9KpA@(M$45u8w;!dpAb2f{dYnA{smB8)>M()TZy_ zflbBbXxhxS#|EE98z)0c*~nHXl~rF%X}j???dLm8YB-m&iHz|99>Gtee_iRtWp&av zpNXX}F>kQ0RpW9x!M-OA7t}@FLn^zfg~Nh10!qR$AGnlt(r%m$G!Y{Ld$R?8#?cym zQP%p2h&Qh7)4-xfs5+dumW759Vo17Xyp#-7vFMJ=0=b?|8*BeW5Nc>N=26Pmh)73(<>_4Q>) zIW=hpJ zT4>#Dy|hT}X;|spR4*xF9ykhZh}FURTqLcmCzj@;)g{xkA8;9(X{asho*7uSD#4Op z8nka5C5usx6~#&}G{tD3O||=@9r=UsDA?9SR@+d=T@+k7 zuGv8TZeg^{aRZXF$XwVinz=gNYz&dh>%TjEq{Ep@c?56>#cF!&^GMHuY9Rf_HxpyP z49Hm@LZOp$_?}4*DPpD@!w|h$(DJDPL#m*;hkf&s!>^39v}`w!WL~^mqAerVQMv<7 zBbBDp?3=ozOyg{@Z0zECLR)sKf%zVM90h>Wus|9c7FLY>C~+qvNR#R6r^%XL*PnqC z#rRmP9>!5Q0JB4o7yuZrKZe(p1)aelnca*M}}bs3%$ z6nC#bNQ;XyGT_+Wg#K^n`t>K-{`~qbGV10atu`)G{v^%@nBN32OH8u5YT099lPqrT zLI>C9StN4vHY-9BN321at6ZLrwIgA$XXFg+lv$b;YOkM&#_O1m)holrSQ{au!?3ss zsBp)Dqz3V@%%-kHrubfn_Fy@g{*W5S5|yb)+?zY8Ja}cLS38Yuz~8yPRKVa{lbosu zm(@dE;4<7QEhdH+Eul3wgm^KeVvlto1Ci>5SX;!I7N6HZ2i6#*L-A8oKLWm7+_E}F@}`b_v&;um*Bt?IBC z>8DlKu>e{%OfDAWBplOWeZgXj{pmH5fjH4Be3)Hd@aR3>hX5B-?C2!Mc z^g3()YKkkn2%V3bO^?0$`uzcNwn2!Mjs@(}yU|VRp~wi#*S$)Ez zN&vdzb0e}9WlH7@A0~Sztfl&K=h#6<5rZ*mGRK55=W@SdU@2v`!s4o~IEkfvqr>B{ zRn;`)elp~>te-oi$ic%J%b;{1YRqhfs_9mJmhC8=jR4Gt@78{@n8O*z2ObB!j`Da2 zbT!%5_$1;I?@j2RP-CHGvYs)FH!YbDB|d>}MuzSL*Qh^@lC5Uq0O*D>Kz}1fgckRp z_l9MQ6<18-KWF{sT?inqj?MDXt{P2e#yZsF+1l1}c3IdO-B^Ko8jD4sdL!?7wlsyB^#i#4oW06S!JF>P%xg$-I= z5?j*ku;O+XE(Ij81gnjp&9muV4CuR>IOD2>rWYz^L$!b2YT^Q85%|q}R4Hh%SEACf zz$3Cuj^L?sytuo2eeqmH+%?b3I_0b!ogj_j5CzV2keM0Q4Ifq;?_D6?KtiG{er_^3 zsg?!dXDhE~CKK4#R7ph&S#kCCTxh&;4R_;W+hS-~ojsPGk1CCAL>R1TBqNHMy$EEB zCGWe0RjE9xQ92v(|gy39)wT_YRe^7goN6;L*YPSVN|O4**7f za7ePtp_?8(H$#6kNSl(7ceQ&KphvHFWqV_`X_FP{`7DH@IaaE7jPzS4Z4L=nuy-YT zS9EXF4Z56-i-|Ov#tAvViOdWSi`xh4dh5RM8G32H-a4CJ!d3QdpQv>a!?X>A9Z37l z`_vVc8~06V>@zWS;GX^ym5h7>}Fb2K9pm@1pF!m;KN8+i{}od;mEzGI8W8k zYjF{MycM!BI_9Ki|^C zASp+nN6;701X3fljOZpcAsj#nEKYyHv#aE3Az^0xjCEZfZo%B%fcBuzpf4a?Zcn#x zxJ?Y(yU;%LOXwGn8dC_j+qm5R9pr59wmxS2{?^>~7CQ6WTU%l9&K7ZQH(QIax3IhMJ|(HVhk=jM7(E`y$B<48&)L_WFn{2h)^Js#U4*^qjN;?`;=DsXjk!1DTeCkHB z$c6z75jI;VLRyICAmc~q{!|T<8WAR<#YMm{qnhrvmeRFGT8wnCh1SRL7~Exo6+b{JieU@c6Jo-gsq41R zXlU@6(I4 zpn{o_y`f_o^A!jO!2R~u0oAz3NdtY<0W}SjnHMch0+T%|ok_=O z(*A2A2F1JKq|p>+#397l$)w#rp+2v2VAOG#1bQ+SuL3skYu4j}D^6$!I)u7HX3_Ry z>mZ7zxMVETi^o8_yB!B27qiG|vd%;g{Sir47N$Hq&HrlrKLreEls7pEXB7&pX zr)fpxJ4)O)Kq}sCGLR#hGLYOGn7NXdz%`L(8@q(oMYg;rh)l5#rFFc{DRWYpid0{`xMNZ@o1LOeq;LvSZ;vt23Vqe5L~+8#vWYI-9VmJ zWtGA24F>m(?d@iJo-HDa?zZ9nKkU70jBZz&-?iUcRh_DH@uk}n?8yFLi?NX{#U|J- z+(Hwn{h?dPjchRu8KfTCqDS3rxsMc3A^{SO#5W|QL_`54L=Xr>BS?fmxj-(H%OsG= zAm-NXQ>Us<-A>i1d(~U-ZC}>r_y0d@*E#bEDW6C0`|P#WbNN62=UHp-dh4wtTbAO% z{KiXjj1PE2((rKAm!Q=YNp?UOz zi9&Y}J3Xb&J>#OrnAqZ{IA4O?2aWB0z(K>Q#;B^J{-DiGg4Ky0EWW&rl?p=eHpwL^ zP^CyM-rO$_R@=nn8mFVir%6r*HKUJ1ClbeaLeGogZ4Tp?rqplvP z_YTZwIL?=D0Dg`+5jO%U8rLr%^?^r!Kw$I9YIMKgrs_)HJ1Sc+?m($1jJX}&VP{sU zbb(N{Or6k*+m}^MQ1f8b#oGk{RqsrAHV^J9Q13i8+93BR=<u}I5wfQLEg=SQ3R>L-1PZ_c)XE0&Xd}wP!${V95i;{y1uA( z^=6undquc*rg*T2b___@f=kvnXIv)luXRDHuG&H|mG1=yC~<5KAK96U zU-@7;_kcYM)j6Yh=v<$Jq~;$ZPagPIixdw~Jjw>86t>cG&p#;E(X69EM(YnAtUp+% z9qa7-`jM4sefz;c2JUo>idZ~=**X-~N%c&8v3|jtQVEGsQ1UxOsA7GFDAxt>PXmX9#*1wD?|B)6r0z~=i{MVI6F zy$~v)3esWWKU?s6$Xvwk;YzHbXo^x0k{|0Gj>wVqT%bgYvS#v zf_72QNCh<%SCUEv3iA?O>5)%ij3w(c#wa0RG{10?C_)WY@ASGxuQL_(G`g{%bxK4X zOcz;I=XR?*(Ieketv%PeViYX)(a*wEynD(eo>i9EoV>gIa)4UfSg!ljDS?)Yyi2Oh z_g*F?cr{39Wqt^FugY}}ta7bCnBGj+e+##tA?xeE&GjE5XY1!&Md;73tJrPiudf#m z0em=HA3a=Of4J@i#2&)r;W2Wx-ahQDKa`3{3tP;3$^PpPYei}v>Xm>&HOcORm+cx6 zDi2>^+K24eLux_>iiu_Wkmf#|uJ-|e?ZcC&#)uV(OS{C#9^xu`W6vg_U$AP{*Hn&~ ztv_VBn)ynVG7;6@(~=5#Udlsk)B0DU3dIMAuh)1kOCvq!9!K$A_}aS2=B6*47`(Wn zGJv9T4t0Yw{BR%~>mC9p_a^AXf_uc6oF!q%+9J0!4GwDG7?G!p+}du1)({m>C6JLa zn}<9gS=LtdF=`{aeXP0@aFcgLH zDQfT3n#Lnk01VP$;UfS+&p30U%s>N{L{jxM;=BEhZN*q(Sjm*t073HvGh}Q!4%!99 zuc;*79_sZwvE*tMkFKy1T;m-lE19?UG#{k&@LmTIablUzj*f=P!20rzwk!bZX zpAj)CAC4k(rHQ6DIn>%JqtqZxn428>xse6gcpH?B_D|e)^-K4*kC&@5QnarmQiX-6 zBds@_7O{;w9Wr;DGBZ-N z+tA%knSQjz{o$h}u2bXYqa|v>apN9x)CDZBV6CyGGrj@LD({1O+PTF}={|{FJ9iT8 zK$$tJ|K7earmhzXUmyw>Tr^W;CamTWfO9qn&%;nF_87S)r6hYVyboQYFL5}{(JE|i zHctYfWQQBo#jARF@vzvqLg27*hR|TIFCYFjX21P#hwEQQP9AcoHl8r!5N*J~bND(^ zV~JfT^vxrcZNS!&9`-jLIube?vxfunIH0vbA#zpt<--O`v7x{bK{&FjHkA*b*U~x< zOgEW${% za}MeP7%{mNXOFg_qI(g)OS!i-d?USQ3AQ_R2cV|@nPwUX!Hww6M z;A>}~BT*=EI)r!ZmBE!7d7;MH!dbeIq8o4M*% zJ`v|&=j_i^tJE^mp;>gH*|>94j}S8goLB_g(&s@owXAk_or|tTJ^}XDadhXE;^9V| zz!Y~LWa3^^Ib|Fw?=QaT;cds8fb*!@=ts427mY3W1Si#)H%2Wh;xS<#E>h`HN7M|G z(GEUDZY;YfJfaEWuSd}aF8T3*B{b?|+TeCGj`EuWI-S0U*O=9e3q(0IpCihp(8}$v zqs4LvBD8&CYk18`J7qoXwt`<#SeEXhz_eZ3>u?vik|;!@5>2t6F$z|?j)W>)xZ$$M z^U_v7zEp767abENy*6WoYhy1qer==J+(sb2dA4!N_0MilGj?0C7|BBGjCGtnJ3Kd_*ES9lhS9DW;&2CqGsZ3avElW^aR`*sM2(3dJlZ_5h(Z zE=Q^4GtRccm8m6jYo;5c$lPo+8@T!?bl zP*=lz6nN&CmUia0iHe_my_3`~2J9)bnouRq4$)qv@JU1eOyO)_+FY`;W*p1SjZzAO zYfn@j79P(&v|y`qJl6oqNAl?rxP!Afh=-a3eif)SG0~74a4EFO-CNgel5;;cXg ze?^o?+FVg{47Csq7ESioeaZ1w9xe@4DO1SYIO>QtY5|g>bUb|QM3mnTqGkY8nRd|+ zF$2xI(U$;r)27q!HDtt~QdRhsi6`_}1ZpV=8R@@;`-Eis-iHZ_xgjz_yS-5lV*1$hUY zprSC(IewUU*0L6m01r1u=m?O4(<2VjD|KamwoytibQ+koTi2o7w1@Cy(0GANt)+Ba zmxN6?8wPy4)l*f^NfT+Edvi0PwNc<|0Z&~yiHvN5T607MZq}Q(ZTHe{!9hF}uMnEL z#rbk+Vk4dG2|Wk<*>Y9=*r{9B*THlU3Yi%$c4oHO0KF_mVvq;#P;TfC_j(4MgkMAvNcf71BYlsI5rN-7AW0eZ<(z<^%S0W+)oH4j(b8xBSeRacB&(BbmFi- zb7Y@JDYo)W!6f(#D4&F!r={!B>8GcxRuHr|XPBm>B4ZSpvl=Zp#Ccrk_EE&)YH;DoJaLU3-na6O6;zYxGngdm$}cy7QiY;{u2Eh z=wgMVKqYy)y9=|IZR%OhAmm`vwX7xRuc7_zt)Fa-86P4_^>5m|b z3r!Y|$gOhfvwXk?muaw&q(2tt6m>*rN_ufZPerrFkXhesQdo z`Py-fuXVmIz+2vWw|T^msz{-sebgtV%I|iB`!|R;TPvD4y;61^63}W` zymK5jfNBIfYFt9dl(hHCU8@ExJV`8#x7mfd00Gc0ry>+=&vkVuqi*J)1#BC~&88LFk2Z?QIcxBFtfSRF>&>mpz{{C+NOJj^ z^48_!$PXLY^p5^{s6bH1M^Xzed#B960eCFiY!7Zrq42|3I>t3EJ!gzk)P1*`j|jGK zS&+tO$@_{z+aY%uqUtIig!JgSNUQ__PK9i}qjX?aI{jAl=ys^B5g%`gzy-=tLgjm& zAA*mn=%SM2u#_X^8eP^OP~_uZ1V?ufNOlv0P1PvhdNyF!(6mO85(?D%MFhFb-gdssV13svRfcnORT9Nkj5 zosTl-8$)nfs(n5{f>cUZsq->p**tnhfbj|fu{2`#SEuDBn6uYBS`9~` zvEtXj?m?-LyY_V^11-#kgX2~8%t4&RrZkV(W{fqCs=|*PMNv+v6X!tX=?<2>x;sE) zY-@qH5c2lMIrj5HeUy(f=$TPHDp{4Cr}|xNUAhM`SE8e?gKB88b!@Xw(N$QaT_D=U zb7YJhAroZEeWMJa)wW41Z_R&(%>2xrKT@hGas@Y??MGV|UP-H`dKWYCYWfJO+x4TB z?MHe&+TNySi}aiWMD}7ETnje_p7TdTN5E>EwkuMBLjWG-u%0HeDz3JpU>shLbbR?bL4bYz&Y3QSZ_AHCkmAr{F?;pog#{_=i;<3$qmu>dyROyNw%7 z0zjz*sG_)&qmUq_T5g!l?V%=wFZYBKCACh}d2>`WN$L%%v^|hIZI8m9wtLE?hz z4P@qza$y2|P5`upT;rrJqS|h^myD&5r_A~6vrS%85?|M>gt>I?J#~N|!(b*l6#LFk z-tA=vnVrma-U8MCEWS9azOJWyD#(=?Qw`DDItFfjm!?7kswZBR*xSv$Fr~a7(PH`5 z@H~w({HSDJ5_rv6d9Jm*7Fn|(SH1mJr8Wl-UXke3t^!o?5g2`d=VE&xeY3q3K6n>9wUj$JFSeJhWERbyEr?Ly4)T`-p0`siLWBA5K%1QGqvq3YcA2S%Y@NRY?QR4IGRItMJQK{U6Gtj z@s(M1aIoQSAI78)OP$nVr?L2I=iMSK1jGgd0e^Bx-pWMQrSXS;tk1R7{Oi22kdi`ec8jie+THV=VwZAu_jU%mJ3G4* zFWX&uwF?iV+Uf7^*bS&%`nL{#$ApU>xADDIhDC$)n_WU+<>SOUPG)q zWP|xGE-YDxOUi}GO(24)c2_mgl$R2D?Wib?z26;S#HDeTGQ%`^RCe)m-(akns^q3o zps+Ky>w&FM`^4g1_tdp_o*PnURCsS^UBzf-Q6n;e-+u={V%v)leyUW&vs{A{~7XYtncpa z?(XgR&182k?GCwWZ1;M*ds7B(6BHa*W-H9%O};&V&=q?WiL$#6EEgCi3o~iD+3mW|zCSB1*8y zKs<*c9(IBiM7y`jTt2EG?eX+OE3$H8QtjT+#CBa=3ilQs%ZlSg2t281DI9m#0@6V= zWFWte8~5|G3DkXuyVa4^-B}iv5JX{^XWD)NsL55fDW_Bb^|T%*y_A3IM~%Z)iEF3V8TkdqmRKa zBhFDSOh`r%vu%>c3sDpqIV(_O)hWFrW*w=@yi+_aJzMOpMA`P?2bhDE zRRzW*MVD?+6q+(4wWf%4nxbDk)DsYm~^=B_Hoi z_lkXB_p$7w-9OD^#VCOylI$b<6;kg>tH`6h{{9}i!T#Rf{vis%DC`KS_YSf~K~#k6 z1~UZ;ptfed*Y5McV69lrfo+N(Bl4B5qewTvAA+>cc93@8?0S1dFIl^XVl~giigNb{ zdnjn8Qz#8bEU#DO!z&zVpF-1Kxj(czDRzI)02c(Ny-@^2Uxo@L#hRjw;^=mt8z0|W zp;m;7V1rP)S4|8YxBZ|;i@9egYX6oX1FYG*=ed!)ylPkN1XL{=Dy&ZkH(2(Th9?^l zLVYeGgPyOoG7;@^#lP#wa^zLB8X}XMt6I9F5XiBA(dTI2e)g~T?wW&eoK~3{(aYDg zzbuoii9(wFyRoo_3mWgFonp&WL%VGhXeHxzAkrICX15R;J|PvylOIs~IRY?wCav}2-R#ZqSXiioSJQP$hOycGl$loh z$OXr+*n22;ex0+DoLV?4drU+`1zsb6YhNqP^=Hjs&l!}fDSgPxo z3Pb`et7VduB$191Kw4H5>GvDMT%nY3Fi;Bk>?V-{BBe&sJ}M$ZSd-1%%GAH4T`_QK=idKD4IK!br2D;iMx0c9i6_Tj4H~b^U0vR%C9b6Jid5b9GoH=|JLJ6 zuKyddk2H@rx&9B2{|wiQ$GyiWiUR-`mk%C4K9ER7eyi)p1F7crXb;-Q&mTONBD*p< zI4B?Y8R*IZc+h776?_9i==9!j>G7JQb9_3OWp`y%;4}w`L;d(}_`xcoc$#V2<(iU( zvv+`R;{+?%;?0QxyQ?86#g%#va@Ds2Ro4`CUK=sOs>h8vSC3cir^K9H6&Vd{-6eIZ zd`#xBV~f(+5%fzrRP~6{+2c`YU|k*bO+~zT_|UNSU}O|rT`0=vT!j%0?t)))mA)Lf zZg)OCuDfuaw{R0;BbA7!Y_qmK7%C57(1^q$u;S!gvW{oK0idYm%$rAcld)#E#wn1xZ4N@dwY$E{H#NYs&11D7I#L*N6bj;nN@bH5*5YR7}4 zd2Dihu&k6yDgw)%vC_E|L~Y;3UUn3l;6Bhg-Q?G%iJjt9SjAX-E;{M)IXc;D#;a_b zF)pIt2M(GZK#N)N_!3D5Tri7H@ne|zF(P2G5ZD~>((_2y0?AJ}L^zX!C3p1T@x=j* zb(oYhxKsysveC7PL-d;iom(vwm9@ybtJ5nsrE>&>j!EnmKjuLZqlnZE9VhtWpg5$0 zL&`qH_weGNJv?Wm9f!mmjt{hYgh28Tgu_!r5%NAhfZZWA+B#)~hvTF>M5H@9=pP;& zE)L3r!QsJy)e08i5we45t(46{4P5JW=M(TFAP8;_hD;6*(joVoXW;a-4tK1WHK!Yl zEq<+8^$tMBQ;etRIBANi6yAm9&_QOp%riK zo2VqJ=Xt9B

WT7C5nL;YujDDtr)tiix<2u{s<@;#^zf9dI`zSnQj_d$DlMrmp;K zp_0K%4HrOrcstNsg;;7GZjoL48=ga3)FcY*x~1*WhKs$*x*@09dBnh1JFa&S^G1tN z*B%`=C1?(xSH^G-I)?`{^W>*04(yN`5M)Fv+M?@~Yi+CGe%h#(fQhr?ZMb#M~5o#5|R6U9_23hbEN7vtUKb(;T%-8VSGsQsO=QD$PnvV z&C!mSYgDIV^UiyK#*+(#IArkT@bJkjhR261TIv0y2^CzPPzKB534A;C6Q;tEX>r)c z|M!@&Ay3F@L!Fpii`5Me0kwFBgQb=W$nIi#(&$ycF=$P}ymFAtY8t)$4qf%uIv zax*;X9omQUiqgy#UL6j#$lzkudxG;)xG)Lpjg`1-p&k$u(PmsgXTfly( zx!R2odfm8x?P2}I)*6eocb>`3v;sy^ZQc+;x{pew9jVPfnSXP*noGrSIC;|ND$Cr~ zn=t3$=Lo)&fQ5ys5xLBD%3|dPOlB4AGlOH-U6sL)Aj2<{jCW*I)&<<+2xeTKTTY>h zp!OshFXPC81``WfC}ic7Uw8CYlmJuMWUrqntMgW_wt2GVrM(n+JDcV9ghuFqGjU6< zAbD)=d_rKnM!M0S&PTTv7*vsr6GR0oSh}cGrziAUt9kM{L!>Ve>7~0wPLNYX`*N)v zAW>ufvnQmh)erHmz*!*U*cHL*K#8YD!5%!JM@LVN&>dm-NXjEpA891*5fIplBT^sD zpB(vG9F>ln`Z_}=p-`igPex!qdBUQ1^aMVvc$4&q8Y}{*AJ$Qa6NPP{K$$t(-BjtX z01|-$sE(YdD=Bx&5$Bav?W>T_kqPCsM-uM4qdqL?6JCjxN|VT!!*Dc$G5L~RmrdB7 zEnX`!@j80a$NTEcWQP#fNiCUg2Uvg|*92MX$n?vpnaWBb1%P64n z2=M20=z|WW^N`;7)D#_K)YZ!i@Xm zsOw(zH9dK*E5t5x}a5Qb2OCw zNljc0Wo_AG0v_E>ctJEhUappPq(Wok~Z`^t*g&n7(5v!wP zo9GwH_PDYO?YzapbGXfugFi) zI5)?4HF3qE44(8xu93!chV~Lc9-|o2@r%|(vkWH~ZGhswszo^D87U)Ud$g*lLwKxe zAKVI+t$ngJho+-@;p??SYE|6eCl<6B%dxh@#weXd(so;0GtbS^p{dmgJ80wb3ao*= zeJF!c=Qr}c>UMbyG(Ipm zX2Ek8r3`bV(HW2-JQMl&>6#A)69-N0tO_y(?Oo8AnC8uv6Vc6&nFqC$322o`h(POH zB6EG?*foGu5xpdCrl&Tr^6T1Jqr5m!Nq4wCwKughh9zzVZ%R}vub<@C^te5tgC}(M zq&!|eIX*c#Mi$2dO#wif6F4%WIzFKlRyW7J6Jpq*6NsW35^#*CG;|(qI$1#_t@I;} z$C%{YXTjYU)^2$#Jfsw4W3L%dJ>xnx=kj>PVM29Qc&dsT89GJzEct@6ijz4;l~^C& zi=3vVe55gRs_e6DouxWnwJp4=TnKL?NOHA6|OXc80O9bu@^EkXem&XbloR zIa`g%(YC7F>YR9_lcj)UHWEC$syclXV_~#8m(M0p`*INgt z%_1+-EXbHnRWC*< z&~8-4$?-S`rjrS?!@Lrl%hbLHQLz%k>wI3sLq*W9lU#}RON8Whic~j5I-)V2IjlII zxUll%>Li^4f6B(3mM4SLlT)S)C#UBzT*m;F(;0G26ADMnPx^Q(b{|pvx-=(rmTPfJ z9jBVhUn7kpx;VYe^U~gM#4 z!}|AK@oP?Qp|d01KMm50lTj#>YvA0TilfU`K`K_nB$2RXz8d&S0@A{yo9vTLxvOtt z%99o2<4Sz*^n{~;LLFdd#fEbemgaO>c+zoxK+$##t!eOBmO)k?PNz{X4};S?5z}2c z`#GXL8Cgk!+Zon;DO@F^O0+L;b97e)1_vCP=uFq=XcO(>#45as9;q)>wJ=>Cj*Jbk z6@*ndZ!QgMl~bHtpZ3uRq-M3ivpF5eEf3dpKdA&%wXLx_F~Ur~94ib0lc+Pz>5?Tt~Vsag#tky zg;jh6U!5*@A(PWv83BzLb)vwa(w?#ZX57&WpZ07FUam_j6*YFw)_sspFmrT*;C!K{ zQ>WG0Kx`{D6vD~dOSs*u0)y7qK>*S5|>{>|x&D#nF`-Yyksa_?xf ztjVRFWfB}tX1Tv2uflqrH7Hj)!lzd@7N_$(E=($s+Fh7=nYXfzmWaPM`|NbrQT8mE zUKq0WwTa3qH5i5y2wa_s%IroHv~s`4j=ILJ#i{hl-BB`rRw8r9i?KBGvs*&e`xO6B zD#0YEtG#8EJ!Qy@>ofG{xSg|A=cGC(^!)g&e}0B`aDH}nK1D&@NQ+Z(eu>a<%-hVy zwhVDUbLh20ldm-KT*6rw5bx$pDIgD$QYg9bg(vMz$u9uBACE8ReGk_?}hg0}biCIGZB!s1PMe=P$~nTJ+LP12=C>6MoAv zJv(pDN6tqnE}v)~6(A}%6qF#H{|kmN-c!IXEKJe3G`CNcBU_s8xWvC#nF+Z-%}+@10+e?_zX*alyMezs=wmm-CCsdAcC}VsSo_ z_8bQ$nkA;i1&on`d3ym%e3xX#cX8fl)@MG)#xC1mSn?;gN3EylwPWRT$(o%JMy)}N z!gJ~jU}BHl9hSz@als>V0D=v*MHz)&-mtqiyF?Q6&A#%XAL)E0iXeS0N3IHvaw}_^ z9C+a*bEh9VsygpooHrL#4o_~Ji#7E_qG67zL1a4f7@a>aSyWjX`jIXM3XtDiq*^8m zB;6n{JQLsyf0EV_B6xWUO{hXsba}CC77&{Qm-9B=WQt2bDrck;G&Ho^#rYLd)0~dJ zPKNX$P}F{TRbMQ**b6+SLCW0Di4Xtg2B*bCx*@R_=SP`q6D5x>FZ4>6y^G7mMSD5A zxYWA2Y%lsu#;Dq`mQ2&dvaAZBE3x#NX>kc{#-7kt!V9oSU^|T^u)D4Z$ykZVbjcCL z)?EJKthPz>$d{LFnr3uKjOFivEOJd?aJ-$T2~QDY_b&U`lO4E^sOgrGeMu~f%gXte z1ca93#Z{cZuP<^HY`Fb~W|fmR7tiOQr(AP2bStW9pw(Osv}l;T5T4GCPHH05y-q~Y zwQ;sYp}e@dEUtjLI!6BI%Pp?^h{mzy5!ZyABJ#OJu8}!XU(y$AWc?dRW$9gAHdlj7 zEcF$cuiDGoS6XrLdw#VPbKKZpM1I}8V!l8$HpHf6y3!WW^hIIrNm(#0d1CS(wXrVBT6>g2nVXZ7(IaJ>T ztSH{q%Usg!E?)^Gr{rpche<_JHb}7sMO}5IOD5C+rPj*e6TK+W^~YCZQj95ROcxkK z(~j$_;rQxmeAS>U#&i+QvNc!Z@dEV{M&1q=#Ius*I_6EYFhm^75;Pxrz%@)(V=v;CN545azjYE zx*bWZmoDlZU!9DL>;D#+k2knpBTtY$mTc}Qaq4hfNNas_-5Xyw;~}fD3cLoG#vw}30@x})MX`?#$w{Tc z&+MP!0hVe=xC4e| z+Fti2IU6O~)?W89!Uczdz}1{eKniHBr$@}gM|lAc%r2Nl0#{A?q@<|KL9iSE!z-au zNRoI2dY&qtR_6G6(i5i?%!M*@Bq6A2jG{?m3_6x);=dgHMc!?7lf*5N*)2_~*pcdY ziAiP=3%ygLniSI=q(tV(F>-+{kV~YVw9^UW^<=;}oiUZ$H6oXk*U~kJTwWZi^B22#!m*b16aZ!nlLR>)&SP+{#-jSS(OXM`4$YT74H!>shIWLA5YY-J08 zNK zm}?cyTRg)&X^wR|T?vLRSh3M&S~H{VvwAw5O{cTjd^(s-XVWz6v!IK!H0{l%HA5eJ z#hCE7iZ0BW=?Hf$(rVc%aN5i`Mzh`&1Y8?~rRj4*=8b=T(IdwySxqupJh zG_!#gowqVcs+@HxW3q|D9cqb5WJKe3n7L}g7HUGbh!@U1EfrxqS4BP_&Weyl?Bf1V?7_pshsy2Xc4N)0SYQ`U&$!5d4+A9 z%b2BztMN$!PexURPSMPl6vrzOMP7j>ywd!+Y*5;GCv4^X+#X69%m@+##kccY3Q~6h zknYT;HU@3y&6$!?+j}x^=0j%_%^9Mx3c7-5z;>wEokc~iSeXE6X3GqIUCTO~_ZIWC zfUl*Q-&)KU@wQr~W!7_P>qR^7Gi?@qG?^7f{kay%8S~KR@(<88jDeAD+)KshTw2d%@=jEa(X~m5s=5wUeFPL8;6XYDZM4E-Xeun%ma_|=?+8nIJW?hn1>_PLlvP<(BCJy5_Vfk`3H`& zC~qoVLxVrHcRo=bZ9+keFdDmykZPb_@%E%HmxOER70+-9VD(|tsfub!fLhcBuqu>@ z2OC3BBX9W&x*#|A7IKXo6IE3s@sUGO9;(1{T0LOCK;&HK@e$6NpH~WPkc3Q-W8@sU zLZm-KWUH(Fiv3mJxI?W7hcWXha7rHOyGL^}A0LiS$uLLQN|%beq@>W)md8;0&Vp))9{9IYA1uX6IGh#&x~ zN(^Qk0+>aH)CD#wF_Tv_^@da=)v{W)mT3(*Syb1&8ij9DDVY){dUsU!o4Pr#i)MmU zUOi%Vg4DHUf2n@Vb=~Wt`59yB`A@md5m1^7WQt&|Q^USCgBsYnZW~&QB<3Wlt1wjc zK<1_yAxsv!HcM8~o94FF_}iMAo+cjXN5h;ex@3pCS&=!52yh^rx61T5I;?9GdqGKf zg?kLOy;TTjl=d>DW@t7InLIv3J#^{MJw+FDlekWK$SA%F$m^XqVfjNF+~J2+8?>{1*J;QSggE z9~N_F2lkQeA0yX@{KvLyRW?IB8$O^E=^uJ6U6HijZZ5e#K@O2I@;gmW&P`ftzzLC} zO*A^umV}*-FiogZT9uUq;VeDGSiTS{nPm67ZtjNLjgp3;DUwJpXRV=%h;WLo2Xa*E zzM)&@OA28WmBx~ql}?9d6qysOq_%}&sHg^*9B8hcJu@_TggdP;+H^ZKP6@u(E-s?e zU18ei>FBy-@3?D!nx-e!4MBA{@xy5;5@3R)JerZOn&F~;2}U`ew=S~VCp9w+Ys^K> z*DE!PFR2Rt*+t90zAE?+@)Z0V2JPH5&yE?@JZVo6d0(f20Dj7JhIBzE{4T>2$1G(( zXC+aXwJc>C+M{%U?zFz63%;A^QEz+Op$gZ# zm+&ZvTFN;Z%&R$}Ae3o=N8r?HCHyc=u>cl0iohqhq7yYQ=#m!&%9~0GcyI$?iUgTO zcz~p&rR_}8K-iV)AlHI9TPEU_N=3NIk_&Vc=^G1e!WM5a9%{kQ(oy&(oaV6VI@a=uF$!lNWRx@t@mOegwP^W} zBT(RYRc)WE+*J46VcNzx7x>F$KzX>4GL|@2!CHt2FzvD+h3Yr$S+Hu_fs~4nBrOFi zuHb1Z5sli{qzVJ0cEAm+56(@BARb*&K(xK(+kt3Ba{0-<$8=<$@t^!txS=nysucnZy>@_?%zfBkU1jHgj^t($OELg z-@9*ur!2;Z#^1XCPq>yr;@9t=-S3l7$f`v0|04eY`L+ACZK5_q_K`E>;{NIVC1UhC zXDt!%Pw$J9X8$81?U%?7a&~`c@5%jt%Iar`x^k+HsS9;*Q5EX2a{Zn=e8^0-swVaO z@84I2N60oJoWuK5uByHBmG&|Kua)2yG|lzCTO~^BvqH|;ib#3xLS@^I(6jr(QOo`r zBDd@N|0~y@!K=Qn+QdX`)qgS4S{<6u(O@mczm914)nC=u@fU)+rL{yc8W*lmJyXp( z8tSJaoBOIcw<^MY#x~KGuuAuvFTnVM6UJEI$jXnu_~OT3{FwI)-QtU(){LW2Do8TU zWBOt_3}1YaF!b>zg4Y$uB~G(1211z0M7n@W7}6I@cKm|m5mGyeojLp9^}YbI_v0_b zvJ7{)h*#sZrdfY+3mmf)6g-taeQ`Tf*)(^?C@$=#C1j^ZmrSwDWUk4t&d5UrPms#% zXn;#0k#r5dDyey$`T5e1KL7kjpa1Ab)6a_^oqXQ@Xv|nMrqBDRpD-)YR7his zuF^^VCjcH_<`OFR*N5`A6_zU z{9q^*>zY-AOn%V*a3{~FjEfxi!yjIFWe;Xk{OTLb37YhS{ttgZp5lkfJ4TK@wm+Qz zU}oD?*?7sjB3|6)KNyHX&9WC3v1mdo$Auls?+xA$6WBxf|S@FGu)Ss<< z?=!tV`<~aK@3U^cSK&7bQ}fvpPI@b-6FIb>y`*5fJ#)#P)n~KM23=U4Ll=xQ8BgYPbw&5*x?C|L6bIsNW2*DIt# zP7rA~kn``hzf}D38u>HG;+MYU+8|Tp|M;a}=lZvQDfwFb@e4-HCy4BeU+R757t?o& zUz{TiGDa5P8T{gRei3z_;R?mYcUl|eBnLT468cik-yufJ;umMgB_i_#kxtTNh>E#j zQiKIk=}baCL z8K4BM0jXf@eFBP-jHDN2^XZai_G&*Nm+%vY^yzciphS9$mTZN=#D9|4jq=&vxURrZ zjpAGr6J?36vZq|n(3z{eZa%sCGD$f6#kVVql-0*;TtDvKQw+0@TcogK`SCzT`8OZ8zAj54 zNk(0KJhUQVtaFscuqxU0#|;+aXemh_uPDgx=G&!#s*i8o=$!xh<55tnZ6`l*>DywV zWaq|G4GY`H)+cNb;w8=tV%m@IWZXPlInaC-j){I;TU~s6p5uy-d*Axz;#=)E2jBXp zCVj5yTg5k4XxjGEV&W1d(K@W8S7<{Y)mRd!1bmNSrzV|w5GRviK9TT8@!i?=Wo z*nYEM-UsYyuJ)THU=0#EhdHAC7Dy#om7J(LBEQv`mvWJEY}g{aqKX!vO@tGs$thSI%_1C#O>c&d0=9{jhB~;AS4mI7(Ks zO%~15NBwVngyy+#eDo0$-rcMDsQpHZNA*$q#)7f@XlPrFejumwk49E}WB$`$5ikL_IS|?Xx9RAps zzfk+Ofn3&C#>tiCQ|0i7Fzqz~Hniw_#4^4PLYI8}^81!21#D1rh()>aTg>Z1@)gQ~z(ApzLh zCg;KdEgnPjN$>ZBB1K{ZN$CYDRr~$`JoGE3uGG!@P2`h>RR_5mjO1=SVM;PU_5K~1 z)Bs;HmF%IcP3Aa|N9E*8*|!#oYNWdNv47x>C{|QWBt?8?uP)Sd1X7WYnCksy!!fNv zH%wwGh*2bJ-d9FmFgK0m_ul38-n;KM@AVneyXn1xxuku!X5GHmdzYbjuVI?roxQgt zcV6k;TZC!u==R+?Q8ls<(!1q*OLlt?q-3-^;U4+kd$+Qi0@8aUDc^Op@`^)<47|to zP0vIqMZ&dsZvlL1i)aV^1iF$+yr37;aF%2J_Rwk5J44*w0l1A>xW5gCaC4+c0ig;OMqJY}l<(jg zX;psXc@(PTjdkh|!0BzeCGAXQ3P3g8Fs$EM7Njf}5L$5ttxAWODB%u$htTF7y3)Q` z{Ctf(Mw&O&xP=@ebHw34pF;zD5{QaUuity)^*7#l{dK)PywSYgXHvh>zCMtmdA)cez23gj z$6mj_l)a^?Ur#ta7f}WXm^uQ>7-o33uP+Bb#(z43Yj z(~%~x!)0i|>h;#72l5t;N(NpS056CTVuFltYBXwC6FBN)m>u-`JUc`yCa?8heeKoj z*NRt9Uu$1IVZ5?t#;ih0q_Ol~eXX)-!E%OkV!X)aGe+qbuMJ*(?X_2HrWG#Z*N7@! zJwz@Mf$rx~-U2>Hs)$OjEx|>vYhqi+4+RIe4nEd(1k4>viuRTM%dfngUTI%md*x+j zFTdhJiWcd=^71Ry%eT13`{gS8-?GNu>6HR?1IPe?SEd9OFW0XOvvJv|T$}(0r-=m3 z%grmRS)&YzSON83W@rS#t9fN5Cwuvo`sGzr9Y_VkCF7}t0#A~KF_3!FtH9cn+LsGb zD7B;TtVtL#c~Q$`$ei9p3I`Q-*Icp`ZUB;{eR(whh zy);npgy}!ZY5`m#KYgkFxhZ1+c4-9CAQ~qxjegF#Pgw|2$_qqUc3&!9Y+jHIUVPz& z7tcIxUu+qtFZ5r0;l*=iCr^!uWqP6HdTEy!OS{g|j6IvYkY2oC)x1#q+P~enHv8NkNTlFD$b5Is(QRWZXj*p<38?2*L}HXz#Um2lwvYy_fEe?%ma- zx!WSQG?j$n`fhQr#?anv@LaY5`#h_c9f=~{O-Sz^ZUxgm`ih{IRn1s{yp)5hJX25~ zU2|_q8F`g=haPME)7{&e2Nz~ym%vJ5eUD{A$d~T*?!r(k3C1F}lE!u6>xcjlU8TbK zRR+zo#-pR@hVmv@yPV2ooHVK~?p46&?k%2a7?m_;M{sgfl&3bdF4c|6wnS?h^t8p4 z(%ltPQVr*8#p)ROU)BbzYip|&(_Q2d@|(zX?ay*OT}xc&$bauuZ)Le&X_xue2g~D? zg0Z)}l9n5$)ymTH%8K62%231dY-JG3B0I?6su}(ZAZkPKFBF(xBF_=O%=>1@NzfU2 zd77aUf%7~U$kae0(Jn99b%lAcTp~eE3Bx`R`o&70t6UZ(Apk;jNo7o$C{`^Xh?f|Pk)k9xyV-7f}nL}Tiw!BT%P=p)i4WZEAM z`qHHSk_OL;K@)B@5w)~~h5g$>Pt!K5T8!rU*#5Sb4md$FaBB1U?g)Nc551A z(WeSohf)}CLHYI^^lMj??AoPjib1a^dJ|+(w7ogf7E4m`u8?Ul^2&>ZLM|GcXJk^e ztS)U;NYShDdXm>;#uAZ!fhbzgb)IW2eMyYQd6rc4d$F3K=|tZAdnB%k-$t$wVT+OC zl~4F%@T%e`fAIQ)4*Wp}{-6W@oE_k~(&t&zANKmaUO)Bv42%AfMrJ%mvGefm_eu>t zRy;!cBm4FFXSZ@Cun$CQr5tz&Gp}&02>7b>QslP=);#2MxD1OPKZmRhMhp4y&!hXd zxc6Nc+~ev+-zlX?U9a0= zJF1a1EJh8o7_N?neEjfxRNjpILtDJ`xnkHK4edS|t}u%?|7;cq7R2FF5ZN0s1Z+E6 zl|F+h-2z)6)kX=^ba?k^az)^y1Y87E4F@udrX*=OQl1ofZ?Y+asmduclx~7&YyPF< z#iI@T5cICFIm!l6&Pc)_U#GW5?lLZAzWn=rN)|vM%chQ~5z2Wd7`g{IDQz)q{ZX=6 zX_kwXF`t8*E!sE?Vb3p=OfHGTHfOYfu)!`YmSkraTXc0eL1 z0V3Q+pVVanm=DX2Q;PXAAC39Q3Jrg%AB9aH&qc2avj|kn&2qNhXzwY#vA|GdMO;X+ zQU+!noLCB@%^&K+IhZItpR&zBM50_u4P-?uP_I5sgiBY1N)>ecLeZ#-2In(W8dEM{ zwOK1yTYjD4-{3R)x1Z!G|3rPQT^+6I_o21Mi*{|vtF_e{Q*Vu+JF9lEnrTI-!Uk)r zs{og4z16kFY9F6kS8Qa^;+7nEvq-p&0zkiCRdxZIP*F;es3xb3)&>kdB5BT3G0B*Q ztqEMYQHax$S0Y`2m3csP4UEFFfLLqH+zSzI)gCix0#Fg?p{$9}#N)13Dkq8pNkL{{ zy?i9~+HwSnNKCOSZ}fm5wJUyuZ|^PQI|KbrJofM0`aQe2H$}Ry1oE%r`USXt`h`IJ z>fYWP==bfG-}Ik;8xX&6gTwE?{#97Ns~5QN+cQ_etcFFumt)fx0sgf=e;1(N_N%8~ z1f;ud{whFUUifPOB^76XN5FjXtRWK3^DpRad>wMn{`sqe@m-2~N_lcazU-VuI4bs6 zB*D{Pugv{z0y#ChjA{3E0Ce;P!9L&1Op)J3e)_`S`fD%zBd)*Z zZ+d?EQt?&3=lbds>Z_Qg6bl`?581 zO@qv34jbc8F&FqEe=DmmH^qdP@>aNnSy=I1rM^IY`IR{<@oWNflH*%_&00EhS8?;Q zzCGq^;fC+1`9AtpzK?ES?dfaj_SFJy^ICd!pzoOzlQrz|tutRWmjo90IVytfzpSsJ zdA(M@ddL3$T3RZ;KF6aVveDPqQUR-P#}nG*`N&!WjUrd`>XOjN+?WZ2zHL{~P+CS2 zc@{)qw{uY7CDo){EheVTYeIK$ACCsT*j3aMUz_V2`_j-f$C+@~_w)phqc^^)3qcfk zvCvobnHjU@)muuVOsZ85E#LgB)-~yZow}|nq7{l?wuu=15heb36MuctUo7;en)q9W z{u+|_J5Bu2fOjKHOHjNC5L6VDjHp!ZZH9GB>;G^_55qj^nxN?=H!I%aKmF%^T;h z-x3dVM4`WGX_;PM%W5%yV`fbMIqMDoiK>2mS)THVzYz^I?Rwz96vdx(^d}}}hKx=Q z&8zgE(ZnMDSQTRdzcr)gOHe;~vv?~Z{1MP2fBk#w^3C=w{(|_{?9KjLZ@zW)=Jd_M zTW`K;Gk-{YYa8JYiEqhOa)8X3;mr{K#`xCH-s}mYc#A(ezNKVRZXgfd z{EPfSbMKuquKJVe6#2{VtaJTa$i+Lq>8t)MTD(0$WZ!$|C-0rSSNzKp7m}k50&7hhggD*k^s!;wJlfqhu1wc*Uk~ux}a4j|u+fOOP zsS#=(N;J-BpXQ-8lk&x&Ex;0Wh&*#Qthi`a_3(lVQPYg8?sOsN)RaR^)5C)(O+*UN zmU9QOf|GfgaQ*Ook3OPTydQluJ<>i}Jdz%5k&1cs$Wk_^N3TBeXgJFqOY>;+$b#n{ zu{DqMxu&d5j}(v29~sD_d8DUH`)G+S*{calZ6}2(-Go({LFC*%O5Eg;MH2)JKZrF3 zX(1U>nxuRxQ&$S%w3$$?RAMZpjL8o5xpUNf-+6s_tBm&1HBFpc>%t{0qC+`uA1l6;9_xSUF|NgzYGi_(T3dXnV%&dh5$j`*eQAe9 z^Vo)+KVv?5to_o=j_sF9#vxKYmL6M@Gj9P3K;s^wR2q+v{l_j+D7kc@xss!S_|lg) zP!At#zT7R>G7)?d5G2stCF#reMOb%LZvJI5 znM1BS9~Tv+p{9*OZ&jzX(V)3GXHLqmqEtHnfEw(ImD4qkFFf(&6Hh$ZJkdUR{fQ@^ z^n$B&Px4RCneq?OnH5jgPYk4;F_m}w#P#r&C&H_-VIYk3WbcV5t0$JE_L6^n4odGy zfjo(sf5p%GN{%!{B0x?`%0IzprP;(f<&-Uvw|(*f`SbGI88Ed^_R;V!-EnCUaw)}1 z=jZ4dW)+j3STF+rJf5*O^_<(mn!DT*XZ{&JOW{U88rZ9z>WQ`BFDQ~NYIxF3s2n2q zQVh)Ti43B^7O!j8JH`&t)#AxhrFmlZRQq)Asi!AT@kb!Y2{L&Pw84cm6S0()qnb_rw@HiPo3Jk zczVhx6y=>GO2oB|~E8PepC7Sb4>etL*f+2k*-Rd!Ica;PTZ%4Y|;`i%aRCcpW! znD#5}GizS+hc>9wGb`uT`kC~V-ZNjR{YN;7May5%=r3vXS2fn6OV3oyTlD;q&R19p zQGd15dQN?XP2IPR1=Q@B(4AXOm0w(F%Wsu})7)7RMYv$E+SAtrY6RPxFA2&g1J`fq@N~m03 zdbal*EAxG>e0IgC0(Vh~LGe+2K~VAB44oXpTX!>gP{Hp#=l^1_3 zn)C;p!b!%djc8?+6V#0MsmYZs_ogqLydrQWi2Nt7Wb}(9mDT*+=sD;5`2|@)<1bd9 ze;!=b0#lJwc`C+B>M-@j5podM`uTy>q7$L=Z_J~3UVm`gJijR1=Ydm)9?&9yx-m+& zmr!$M>G_q2!&wd1-^IG*=J{nCoVESxl}yWM&GWq%Uq~-5yzt@+FTB{iu<+swFKS&N zi|BZz7X}&|boGn%3oVKQX08an^)bnV>Q-NHfEZ{U+F1TEU&V#kC0I-!0#8x z(Y`oyf8EU$ zLrYA7tVNW)L*K_cbpSco@h{getppN??MnmA(@VIMv1PX4M2T4gbb~fh^huFkDp(hc z?aM2X(%L1(kX)V-m6XJ~m(eVmJLcAETUaf39uenib4;$AOkmqB@(QAT`D)d?&Y-VoVXv_@rSaB6YtM%0L@dBbiM~yu_S+Sj5x(N6F?bf} zgPZi?Ed3Y}SMg|HTU55!zCA^8j9gGUi!w^{kbnK!a>t_y+wisCw_hv1Q@@_R)4tyO zjt5QK?<~Fko$tK!3zEe6%CERbLTyhYEO{tHf zB3b)-%&y8sK4zJ|vl#v=s&XN6o3hFV)ux)GZuRB$<~#SaCzo;FnHF;k%d5d9m=dpk ziG_Ns6k65P+PuCXMviaaXy06Tmh@(y zX=C%7_%6#!uNu$vM*Zf1#T)6(0%0nb#I${5(Ox(eR;>k`t~U4NspJZbh&~bN4X$<= zuwr?iV1kS$@}G-vW1_8Tv~R2!R}reNfYzd7-h871qCkQt6O}0jwhLw{LYXOZZ9W1? zZ@@qfFjYMS5}9HN0X0w98K`!Za{Qyt5UA#ECL)8sazsnh8`ta@E^cycu&7f~lO)`q#_o3~bNG@_D8*}nC~NMTAg`68aOy8=zyw^uMY0Zi#d zB&yX3ad$(6s`9fdnCUI5wQF)yV7?|rC^4_(mFjSXZ@*Q$^AV}gCPD({?I}5W?|e7C zv-I6}-udo#-}!F&PW#<9R;;UcitkR&SM@u~;q}gUn|B(53dT+r2?kEol$J+cNT;T$JSiMS5PUB%H5Glj+~)UlBpPV z1qNhmSB1~tnNyL#ns;&~O-3x=c|dWzd~tS~Qn)!YJE>)n_UN6x?-$>@_5J?$zW=>B zvj!=@-+r%RJVR<*n(q(3_x`8SlxsrnAV=Y;#6*LnHqN|Aei0xAm<2!2+3t)Ba%DGcFAv*A$4wI)+A$yb{oTCe6D&Evk2ySja6| zEj}qsqA(DO*ueP*CMT3gm)^bRP)DPC7vhzP{9*ezbG~F6_hwVgra)Dy_(2B+Vi&sV zrB`m7nxMK>pqtmSyn>U`^Ojwd&0@(4fu~Lx{cYWAnt(x#txUqTz=bq~FF35TC`tP8ssjS? zLjcJC!3U%BKxH_K%q2>R3v>-pUiIM>oRrq@Bvv0rf#RjaV>4AHN?Jt^qR0-zb<0D! zOW-?m@nQ3u#Sc%BDRKiDBfG!ZGWLJ?o4+|@b$}$~1Q}(KmvqA{jl6&O>#S}g!V<0` z<@q6^==pCheDtFqee_ZNqvE5}AN4=_5wqS$KT01pC@PDT^B=9sE#4E<(;u}+VYgBd zy&q-w(4`*@;=rz(=Jas(T42{w(Z*6U_$7Eu&H# zdmXf+qFJ`oBEsv;>-%y&d62RR)Oq$7^2q9f7W6*;Wd8BslaD|CBz;_b(tNzEDX)){ z6|;}qPbwRd$MWMo)&^^6i%&{C04Z^*KVDSmCm$z!RankYPmv)amtnRPpNv_JkeRZ7 z^6^x$3Z4+9tfDgsW-|v3QA(6pP?1D#HPTp?jPWr(87Yt_??WZ-;AhR25pWgWN(;GLq-oUb`QIkHC=0^Ioy3zZTLB7?E6_lOBK=X8?Ks+sD zsBg@1T`)=`m0&zn_)6@5`METWl`K37qTVb3X`#{0>y5SGCM;}=0ifPixD8m65fYkk(N+krVwBU8wHq4?+gsb) zTWP!4YPJWOR@>LN(D915Raa%Prv`ba?L{fJwwtYi#>Tp|Rc_zU>cU;N*>>7$JMNBS8*5PwQXb!ZTCfy_wDrrc?IN9#w)!^NN(>O(o$9<0NC^!Tc##~+6>UH%N zP$;(M+oq(1rcrKR34+10*#>F?{v;^#^PrOec|-(;u+@fADn*{98EL`aou6kx|#Pq{CVc;vhuJ|C-e#KYH* z#>f!eu^xP{XVdF3^K+ExI08{0@i=)!B|Ky(j(D6p>Ji$S)vaS5+J3~NzMqZdK7YDyJi<6X7g$f`t-7ZH>uJ04jb|2v1waRypE2A3q-O{FxxA4= z4@7Q<%L={-5l}qJw;c|G7LOC=Rpaf)_M)6Xan(V3z%UU4f;o{f>Z!jxt~i-s;2S_G z{dknV)g2*0U=-#u)efu5ea>+CJv#og+WN(+>?D@wCl}pTAj*&+;fUPi!3X zyv+P`&3FK*{G^{D4Z^c08F?OOe$*$Ado+eHtL!tL@PN^JvS=qRYx!}YS_>!g=)tCe zDGrK_=X#!iNIcJ-)Ww7qG`E8Y>cOEGWU`CY2U)FoGtuMg^k}<}5IxfF06CuXth{o{ z>~GC)bNwCU5Y6uVe`F@_gZUW`P^uB0GgOU`2H8XA$PnR?NR~N|4Js-guw-vp!=gu3 z$xWOr|NJV?yH{0 z1wvC)dJIQ62-yz{(UUjIh>xemC_Jjy%)s}{y9;I1BUscJn_E9xL|Q#{#cb_vzqpuD z_XHK#>RBhbQSso92aTV(X-=Gmd!NMOB9#J4P5OU(^2Z-^J6~CG`9zY>bqD^SpYY52 zE<149fy)kDcHpuDmmTtzQnJ8;>7%MN_rI?yZnm#@!r2ma3Z^7VP{0RIhe`3dm3?!e!v zFJGVM4qSc$eBM6+|4w`P`aE}lPk^hJug`M_F8)I3*V@auI&j&CI0u(~xa`B_8Mr(H zmuKMe3|yXp%QJ9!2L2$Pf&b6`3-C93$NgXI|M}iu?EP&2PxgPI_b>E*ssCsCKi&H; zitqQY_y2P5o5k<-f3E+>dk^=1uK&xu{o?2QKihw{_osSq^#AkTf7*Mv|9tO%?)`=S zf7JWCy=U?Mw|n33|CQo@=>J0hj}`y0|4i?{>HWC>bHy+B|DE2y!T+SY(EG#vf3LXO z|F?SoYX4vEz1RD#{)4^$p#PVO_xk^C@i+RvTKvWSFN6PAi!X!m@ArQN24C*|>HeSU zz24jJje38r{~s3rSO1yfTm65%_fhY^0{6e}|6=c7>}~d+>VE;gf4BdadjDB(ueaZS zu=tJsPxpVJc(?Z}{V(-@ssBs8e^~sl#oz4xPyK(b|IhcIrpi}}pYMII|7ZJuq4>xB z`}=>Q_*(yO^uExW_WwGbKU>@?-YkBl_j>=Y_5Mizk>XDj_ZNR0`T63D@ct{s^ZkFR z|5Wc*akuz!@2~g&Xwbvl#Vm(4$X_-!A@U@lf%ni$7mHUHlXB{3rc? zrT1*{=X#&^pX`0D_}}`gAb$Y2hx)(VU+VqI;?MRD`+u(gGyTWt(>Ar<*L$Y_i*c%T zy}ZN!Al~8sf7suOFYh}>4v?9@$gfCqzNt_85wfi>_G|fmzathuMyA{_H2{OJ1 zF~I9~MU3_4%M?X@DSvC>D1RMfd>5g=kdW_mRLV(!)dp%>ajftXe}Cnpu%wi)=;*s4 z%Z`AOho{t_z+LCn@U(M)#MH%v~rR5c08mW}Aj-BX=t#YB# zPF#~bgN?3p&(&QPI9>3(KvXvInTW3%rL^sJT|9H3zMrvJ(by3o#>oB{UP&mrNR#FP}66kkuN!_1%&x z#jytR7fbf>)VFGeA%97xwjuoETROw+@5U5FBr{DRujFKLS6txh%PTPvFz-%Q6Z{E^ zqmnRj9Q}$f)YKP<@-n8P;X6N17~j1qooZRLRr%Bo<*M&FUP1}T_X z+kJ7Uzh9KlaF30+IO%nK->T@V&kF7O?XMb@L80B9k(H_qt==$c(<&n?ubGO2KHjwX z{=!wIopp!Kk@|L6CS~H}Fm?@yJ1eO}vg`X@^&PAkND=NOUr0+Xombf^)ZHnJsm@*Z z9kcp2TC_-vC3A^BeBzsGrPl$jx|^X34sHRaJ_toes^cDh`Riy=3$A9osHXAP;1Vcx zd`+&Cw@yec>i79K(CVgkE6;QISi4i0@^{yAtUC%QuZxz};g#q}_bt8BpMUc%4h3Fy zW`Vof*EOfr7xem7rTg;Cfa;1r22dIz?6ywOkb@ zAZl<%_Q@HgtCKvW*%iSC#gce3JGG%ToFMiQg`9G9&g)Sw3I;p!C_nq+YNVU0<%Upp z1(wkWHqa#0f-!d@D3syEnE@1BImf73#9$k@ie^Y{*6JdkAMmZM4Z2a88l)ctkypCD zVHS+kq&1=xr1#hu96b4e)iwj;5#CZv6sJPf3AIeFu-09)VpQ={E-{LZHw4S%?a@SJ za+9w+Ey|qVwpD!ewpKN9_lJkdi=0jB@u`yCQm%-j=Quvi@CP88?jqzGq3VE0Xf4U~ zHRYqp#KT2NGYgUhRt7HJHNy3VRNf6%1>ei>Bi^Os{1ZGjx{d%){;{mQ-r1x>8k;vv zD+Y|L$|w|mAU57C2gWfiajB%mqjdST{n!LiHF361b>>48O=|FJytz?tnK9%lFQgV|gX#5-)!Av;Jb&C#R0|812>Vf$}OsJ-%i?6#13hTGAD&TgZoehRY0d1lB>vXyGf0IobJk z#GMq^C{CNLR(flgdAl!a?|96b<=`Mleo^U8VVi~l4n3bgq0O7?8c_Ka+`a2)qZ|A; zhEGB4A2&ugbvvobl!aga5pBYmM=>8|i?(Ns?5RBpSHHV3?T3i|Q)dy-5u!6UYtAA| z(+y!eU+Qxq=xl|@GzQnK96DUeQ#ZPy^-{J;c!^zw1AUZ_{LdQY6$de@!Y}Bkp5tsN zi4u^UwRnxDVnvT{7 z_#QHjtPv9ZCK|i3NyKWv%Hi-goS>9K>$yYA3#YlJwf$$d$xDfquxSI$-CoUqgYrp>W7zWnXrADplW%VijeJNU+vA)ja|k_?XP2E1z{e z6Nu_iJ$Wa1f(966-l#6GiX)p{6(m+FNp_zA?PjVMwHDN>O)fe%%9|Meu(^uUxd(Bn zS=Lfo?r~Ge-8uLz#Cv+) zIGrW!2@e>ti6@l+(S=9{V?G;jOFmxA!g_AucfE_f3U?Lb`z)x%O$jd*rC!YI6=t!V znW_$2+mr^n$R7tz^h2jqMZ@z_Ix?!NQBFWrS$Fhw=LGK{D{z&l@D4tX=+#U^WNHWm z%e-UUPwKLI2|=#887)eEI7Si~IZrM}JMLb27nnz3rl-`ZsBr~l*G>T`-0#j~5@)+^ zCLnYuRejxAI%h#)js4cR|)JusJk#{=DGx>*51ZB^Aw);k&(y z%t8{+;HHndd|pbNwVCrc`iFu zCNX~NsXaFlJs;>UGOP8}p95y>3D;u;7Jjv{j|g!>33A7LzJb+4+gX1k0P5y2Kf4wN+Yvad1|7%f{dq>NF5W{Nw{ z;JvB_f)rwK5g+~o7!*nLL{uP=a`Q5X;?(}J`@~b8R?R^a!14xWQq^Jn$svA z?9{}djIKq!lcQ=H)>i`wFugknK6l(M8L3*fn&b@}$!Ud{m-T&Gbq>qOEVWIYCpONA9CBP3T$dN1+&qq3H zpXPdMXE-T5K-7puMQF!eodCgb+kNIEG1s8GMg5$KNR*?fQp?!1;rZ>UTY#)}JrCYA&1 zFt4s;SR)>xioG5ZS;-hlak9VSMvi3%MZ2w5WV4sj%b_GzH^4mhQ_DH(6GoYn4%|7c zCStAoD^8YnBaUF4@HjUmx=}`$=bNaC(KFERZ>fN zR`n{@MM)z3i}DmXw6`>hJw%4mRHxRB1;iZLBCDCPg$7c3z^bxJC7&cnDmhF!5&t`@Q-`ngqFh%?Q5>sP&Eh53CDm+k z7Sn{H;uh@5e>AhABaIX|^Z)gkimDTWO+`6js$wb94(xZBmX%F!1v-i96NaKGgpvR8 z%b3xbvRaFXoKFOz;JUgJXtq;#-n3LMb|po9A_|>uPf~R)B8(_kev(LoC^sA(QI4yg zDvUOW)BJ+AJ3^?AMj72H2MTM-lRywKr&3_icJtCQj#I|YJ<}11Ll$Fnnx7g3Ct&kV zb!gnE1T1RFE9d7nSC?Il)eW81KJj7WiujPz3E`&qKJv4kd3(_=ZCZ=V43Vj1j6~Wnt>9Io0J;QnP32Xw$Zt573tsSpPY1#K8*uqH z;MW77YD9a-|A24i-601@t)jt#(jqDYta4^Z)l`trO>U@sd?WfWsp_Vh#2&?MUINoW zaXQQE=I9iJ+I-eaa;JHbA8G#(Os-2MF%nob<}reS?##B(c%-s=sf5g%yBs> zyKNYIb^nu2&9Z=A2H4QsVd|VXPq5s!$qmjPg55xx3(H#s?PU_HkQSl zwDUP~QnvGbMySkzn9H`|k^gnFJY^;eS>_AnoCmEct}X|f9y6t34&ij7?$68lX{mWx zE;6@&>pXCnPwcSgt57>0Giqpgm}^UbU|Mo&9dnKB$y~6Cpe-PYd8|1x#7QeMidMw7 z*XF5Il1ZtO0zjp=bNXmekSt0e%W>I3U6nPFeFKh3O_D3wPWIwy)&ENw~tX9vF zNR{BNl-d?2LQdkdd_ z&hgf*G&?uM!Q%G@V%6I?39ec0>T|SRJk_b-sDA5_#}y&>j>+{T^pROW+5|-jJQ8U= zkE1;=CuYl9wm_ZWTM0>L=UlI~EP4d<1c{@dF+AfWs0qT?sS~?)zLLACTAFSvoIyL4 zZ!m#zd`t7MqotG|?NKL#-OR|EU!1$jT*O0JX}yk1Tb|7y(3E!`Vy2#TvHU0^M)76W z4c%r+Ix<);4jl&tpvI-vat7H>(|p#PsdBWo%4bbpzX8xcp8x9nzjYSn`&-BucYXy& z{`UOW=2SJC%@=2Lt}{-;tj`Rr8Sbq4r&;JEY|xCr8D-Aqb6g5s_`id)TW`*^pD};~ zcs3@CJu#F<`v~od?YPKGNV0M_=42$8k;?(J)0D)so-bqZi%pr0E}6a9z2@ncVdeC)}{rOBvn@wuPNk4?D`eQ;;g_NZk+ zJZNe|y_r#uGIrIu)edu+UkD%rMxQ~f=u(;ulwv-+nsb=}Fo4m5q!vUhu4@4(7c5oY zZ4p<)o7tjV=X`dHWSTAK$c$FvQxl`MhyVTdcg%T?2=2{*r?F8^w7qd`oHXoOHcG1& zh)?q7sib<2Jz*0?rIQCfx(&nuVy=NYoFg``);T3Cywses3r({t5kf@vF~jR#a?z+a zpVgF(t)6u@TV##?$xW+T)X7C|6h2bXmQ^_fTH^wA`n7Imt1)2?wJ%5~g)ZT*erY$< zmNZ+kQoHCZMsT@0duv@5oHzkGU22%Bce9$A?;i)Z+W5$Ur-=W)y`|bIx-p@rjM`>F z$!|B$_ZZJ2kM`-z>U*l0qY#FO&vcB$ZqNIneV8DEt!CAERb$p&nu9pRQ9zU(JVy@J zw$2=`&&FV;@W`f&0VNiS2w&-ZZ%C!$bT^zaMjC#DG{3_fAbuO3%YJ~kg|tm;6{kvu zNFA`nl#Q7#&!*EEuPN5)aMou!oGnN-OH)Wr`A9-jOhLiN79x6l$jt^gSwD4Lk{F%+a&k(W6&)NAl*3{g2hAfqK!B+LAzt|P^ispy8((>`!PM-1Ig zIk0oy0>yRnWD;ty2odO_I1;gCQm&e|Nj9@DGG<#Qt#v(J>mnFy6DbK@vUbY(p-l-$ zh9x8MlN7JK``1h?ry(S`D>t8<(?5nLr?iWfSrZ3}|BF?btX8Ox7$0Y9OB`;()sx&u z`S33-z0Z*(cL#{ZDb3a`0*wCYTqawpdp0##%i2*_X47)7u zQJ{RIk`(&_hR=|cYXPpEL)~aC_w$e@j*6?9frLd|`DM#|O`eYdN2yHRY4>%^jXf*P zR{N$VRm4@ExvNe!CrF){=K@q=G225TOEEjn80AzoJ&U*%tG7e_ynp2-2 zG*Z^qW;PQoR57$*J~N3qX{HvpFKbIQu~8~z#OfG1n{pOZml~kJ*rQ^0WL-v|W1OHE zGtw_Iif%}*VTNMs{H)1YeV}F#)oCw>EQhGirb;7@V? ztH!W~T?)?$Aw9L}LG;EG#{kY%H)cd6K`=fn`qo>2F6<(u;4iQ$0~p_l!{A}#mMS-wU0JVYo$=8cKU}hnAYKG z7A{c-!}u80H-)oTykg_IofV{|c3HK@R`Q`NrFN{3Hw^L8CP*WZYqZ*g)amFPacWHM zJZe9u(8N%?+jVG2Y5=xh4inC-5SKJHKXpSHl|^SnFP0B#@G3^8xU6*xR^|bPXsGB{ z0+8c$I(JKp=}dLuI>xbbi}9PWki-1E3o7^w86hfst_{jqz@4}|wXZ`0t9uRt$rMqa zN4v9BkdHs%N-ldzDF56abnj{`FG97;a`Oq`1`}@$q*IlOl~F~-iPV9bkX^Nx=tc(6 zsP$SEeH~z za{4fjY0~%v0dUNgjpqo3ST7q%$0WtpA5X??#&|Sglg5XhNq5KAh&bpx85IdVBWW&l zt>;Ff;_+l+C;AQyEQBTx+F^iNcB_ zOSD#9i&Z2Ij&3Wd#H6iN34&FK%as4JOQ7}1WcUk#iJL!mBL$W6{sayFZ8lMT7HNFH zNT@x&%3e>FwBTJ)v5OS4H=KYao1#C0A$i2t9nqizfJlmdZ5~yW5e*7b9j4q|p3WQd zYVrkB$UK7J7&hhPnsgU>ayan3Y22x?rKVY`5%L!m5%htM$aN`k6<<8jTVkG0wA9hfn)niMy0KLY;BSTn@Fv%h+6% zAg9W>9k#elRjpo7nqrOf#P2g1Mo@~ywdnNp@_yIYo|AMn5EKe~v*1vSWK^_df(TWyyI%K3+KCY-#{rs) zw#IslF*$}#nZ-mjm8Jx^rub-!m~+tBB2kSIiROiNYQMI?q?d-Maa$HF5sxqQ9{FoT=>6PnW zQ2?*e_-aIE^1@yXjf@Rp1~RO8sE#!1<07aQ4eju1=Ki3zZ{F|5P4LkGtjWFOJSm6| z0$0~4hf=8w(NYrH=25#OH>Y7PeKT5+Bclr(8NOWL~wn3~fHNK|vZ6^PT^2#u4`lBtboO*<}~ zkDvA4-!uEE31X26om#2D=w^(nVTfjoh_rx|QzH%Fs>Go!#=?--3=i3AMA6~RFC@$l zM-(W9c->`;Uho?Vb2$e`X%(KL&a=@W3l-L!7d8shF*ra9E+hL8LA;_*^O14|K@~G& zrJWP)u17j}#j&vdq^4GsXQMot=Y{x&YhOx*z?WUw&>b0*}Bn;NAsnoDRsR0@e; zr@6FoRLouFEH1uPeRwTN#Vlgf^q%_N(z)$G94<1&|O4S8+4s>O~G_VlV+-hnLU2 zT(ih|S#;+{_ULM^sTwZG$<@X=aH%>rtxV)B&wHetesKxzD#?2o2;M>d-74C9ig4G| zksPg~>#R`uLdH8cYOU6Dba?UBAH7hn-kls|O#5pq* zb{vd$^kWJ=Mg9S@<)Y)zl-lLtXcN^(!`i)_F!v!FIzmxXWQ@#_8FC!$V`uq^izv%~ zKm0D&ZLhTbuplNt5;}|a+6;1uX z_RfaoIUP|cE}&ZMWPtJ9F74S;CROLmbi*N>5i?OGlEp}thHGZ4)me6}l`>JkB1N{t znx9uAi#(!~V9;d{^N5?7(-)&1nU~V=Rto+!DKedJ%92YNQk2_Wt7B)T8(rge#uk*? zvjtiHOx{`}Rl^xtcuvpyc$B)LC^--% zr8m)PGBvC!v=gMp!~3uD09GTVb&jlQE+{oo1P(f7>iET0ce*ww_K0Vr1bUgd^6>F; zw(Mr0t%0EBi>AbNjEa-Ep3;?VHXD&)GYJ?V${{Qqe8n|qb1T&KaMcM=C*>;9Ziv6C4BL6bwQNrhkkhl`6!q!Z+369}J6;wn zi_`Lq19AHI5IJ#dPT7As;(vB}c1jle(bH@#PT_>*7M9P>w$GO2&AYPp*w-<(T|}60 z1?7Y*Ejb+`vhL*hPtL~Y5y}58#fX<;UvA3to zijh-tPWBP+_H;o?xKN*l_Oz!mJ9l)f%dUF9eyz*I0aU_(tWWPZjMxZAmvpx5sbQny zc?6%DfLb5|;Lpz%?Akkp6kCaXMHqrXqk_&2V&9%#wYBq6)e5T^`wro1ziT36LgCBb z^`G*AbGq8;PEl}5u_{v?d0jxGniOROjcPA{VrYKN>0($L70{?KIS9YbRWeoIJ4u=#@jj88k5! zw|Vvp2=54%S+aYFdX=(K-w%4&h@sWl|Qqc}OnOCAwXoIug@`c&HHbVYD_*^5G%*1nFF>LfsM z;QJBf9PTF-ux#Q*oR-Oax=h@ZcAE%|`AqBptWK8{#x$KS3h;!9(x%fj8zMzIEnNVA zX+=m+Rk?K0?uwhc1eIY^nc1h4mEdXm%Yk=#LI-muigzP~!(l_K>Mn4#R(qS=(BQ}M zhDmsFqKS~GrR_;)lU<1B8+#*_h-!?U#||irlS;`IbXsIlZBeKBIe?-*>9eX}(mTOA zP)*Xa5>XO3VqQfRSa@nnrzZKn~Sq7IZ|fju@_+gQ=M+%C1o&bVmi-BeUm9F>dz7fn() zdVAoaT*+1H)JE@t5J0U>mUn%!qyXO4$y%PtqP~j0JCirD6oJi?;a(seY za}1y3=41sW3NCb$Np-RsOR1~l6&Yp4d|x+}Mhf}UWy9ZZ6dB~K1+6~rcYfK6yMa;$ z@@Y;M?3|8!;ky`dHE=D#I32_0eq&`+dnhCKj4=4_5HU2)aTLQsilo$BmmP_wF@wc$ zRsTd!eJMTGUW;WA^frjqJp&eE~UkWPL|b(m8w!UYjs z;U@_yf>yUUJ>gAgbG#a{3YP=;=iQ621%q-dT@RmN$I(W+Ct(>)$D(q>k585}KEBhF z2f~2_%4DKSq#pBG20OkMk9DpHY>@R+@d-P3~KqvRTUgG#m6QTC*`p`s^g`c zrC~L*ghxcmPX!$te~5kWxWiL6oit^Z_#hucPoeuL916WSPbg|_Rn)3<^GJ^OHY=4k zMoL5}M0e&5@YY3jaymx#kf=o+iJ1bAkdosOeW)1)6O`sACa*CufL2Ctjt57_$469h zL>y!P==g{(9ua*sJzkda_~_`E@4~{R&mv)3MCYjRHbjYKQO-hJb({i^Xsf}}@wEUW zFed4ENfRUy;#69Xj~6nE(5V?dN-B0?q2EVTa#S7nj*gq76Y){rvMWXzRZtWqcZZTo zh4zk(#wHj&#$1-@aNK~35==EX6to~Gsze0WXp~98gBvCju0Y@pFar)6L?e}oP&%I6xNZX2{gGf%FZ*LrhT=AK#ctyF{4WrR(5Y=IQ9F`KncVmq)9y7Msce>Vi*= z=qb9zzy|Tzm)TyGGw-OkmQe&vsybRS=Rhl^JT_@D>ll@}u#u0iYETw6VeS!5X6GVx z6LbecJL5!r?zMfqZhcwoF6Uca;VOIG({D1Zs@j%yHAyadI;@5;c%iS2Xp~2u20sf|vCnw`sSvE(j2D3FCF3T#g zbhO;X1?c=7yzM$CbX6e+?cu6{O{B3xaZRSy99}oF%}#Mt9xi24mD0xiBBBDAmLJt% zY4>;=tmEeLU2e+dDxZi@A+P#yAjs&4y2%Gkn81-^aoD<7e0ChJ7+;s5&PSeY>Ls7* zNF_L-YNH~9xYENaFK1+EU5WDxXwk5^#s2akF9dB)t#-NRa8(>X#+dOH6hT|j-k&Q5 z^F`$Da}=JjIo);=g$~q?nIIKv0=n|);+pv!)6rPVHrXqeDw4l?{`$2;T69nz^3a0A z{sG6~pnrJ4l{Q)cJ4lB$)++~x2RI9CTID9Sx}tmGt$ z6{ntx6rZ3iKJCFuuI>QnAQ4_=;N{*Bs5*rm<BqQ%_pT;e8N1ip#T{=R3aY_ZQ>{SP=qbuk$2Wcf@62XrlC-=U&= zK1lmLP22rz2mAX65?y)ATpuiGyAFCA<&7R3BDs(PaUVmeLOP*%LbiV}V$$7)}iC;&6`ONU>@6*YX?; zHbE@#rrhA&YEw8K`;)*+2dmC+{?YbCE)_r{fpQM^*Is-&T@VooK9$5IZ?!f8Ppo{<56(jxC9urllR;3x_Yk5XljV-AKwn<&e(mP(3)6WqN~>We`p zXyspFQAZsEhIp&(J^|Xu)^3fu6MN8_&&9SJj0iCWx2-ssWe4(bF813!g7^0K_xAVj z(qwOhvfgj@+Wlp;R*`p)yn74y?KA6RpxH>mRio?$^LB61J{SrsGdOkPF;MtS!`_}W zk~*}%X9q3M9mnvCyzDbM))XD+&NR&-nHi?~qLyaw3^J{1vLOhn;Er%)3OyUMN5hd8 znoC6J&8buLzIo1b)h&fJdwtBRc4%$dpE*d*X^*3(pnAW`xq^clRPFcn@X)lAsL>J8 z*ho|b^L;*!_KpKkBzyb7w|mRE4WK0HI52KJw5R6Bso7gn%f_>8bRgkDR3oshL8HaflO5>bEanRx|DX$fzysx;KE5(SVRZ&@z55E zq-cwb#)49=2v{#&DwnO9ttl8NfTq@Al(i1SMIkWly1<99K+hSP1|L>rtJE;3YG~^e z*rB)!(QNZ|hQS+3{}e>`)hOK>dw_?l+M?4ZnIJm8s%oBh&U{*y>bgp;#5w8;WetaW z3h{25T~uhI>nz^Pbt#-`(5g5bTaw z9V4*EAHKWbSvWo(=@SS8g$8)LE4OhrOQ(>d3zzIIEmM;2!kejba#YPP`-qHGWtJcp zE}}QvJ98L2?(Czzw0nRr4c=WiFNgL4t&&B$+8Z((A@jXO7foey=%5N-WidUr)G zCRZD&*ekJ@yS=^LYIivhcFCZ^LDtp@B+_;xA6&aj0Yr&&CxG29_ZcE7!AtY z!`$qyvi5t|#c+CwirxjDH-%#g$}CzagmYf}C{Y93+(0a)o6YB%^hx&vh;uhm$@Jo# za%L-ZgxthP9F0^5#J%yU)5cV+xTTB`ebHt$>_fSGU%<+!xAy-5O}(^DVZGg*v)y86 zwmaC_-QD3_X<*kFik-U%1a|h2I|u~4<^b4-#_rJRo!@0V*!>~bQ$*I^-UWEbWNWv- zv+JN^R%PH*yD^8m+q-E;1|cbnVuhjg{;n+ByVpcX?>vsl$c^U}U6Q`u8OU1i^ck9+ zCA;o`&5bA>Y(WVSU6BMSFqlnuxcLO2&;a1Z+gZehD(z4SP3R_0CG}6sDx`a^UJ8^# zl)NUgL00S|Lvn`n`zS_-+MNX>rrln4+i7=}g(bqmU*+kL>&_5#-()~#mPIfdIegwrC5 z3mw&>2gIXnMrd}f#nir1rk(o*s#jRJUbm)GVGspw!|f$Ii3&5KBD>LdTu<6r?tn~A zB;csw!EA_Jkuo_*jo?@bFzQr69eJfyF<5YtqdL+On6{TYio%y$t*(nyN3`C4FjMZT zQx?T9O24z+hATjV6@2STF=J(G)xu``N@R+d2F0pjaS0_-84+uvJRgtrmTLP12!Rb2pv{i1e1U$IHQ-q}RGar@NUQnwuvN*_hS^Rke zmbPkyWT>NxRuro(?sEZ@>Yp-Qan+g=8ckWss$>evxF9nt$FyK1q$Im4Q3oj*4nL*r z^7PwGq~WY>4FsQJsJ50O9UN7W_%#N#S7WmvTv52@ma#}%D^l@RbK7p~&Qpq-y1%H@ z+K6E2;$y0oZj-zAX2@UY+O^ofW!nK1d}V{2%zn#&u~l#&a#3KS51mDm5m?02_raXm#gw+OtuwZ*%++iWe|WyUy=igw(k$1Hnyv9?=F*yNBf_3_Xs zv)qWp*jV4(U63O&P*qGNHO2zRbay#W?qXeWl(MJ0+)qfd3;U!vF{rjGRPEhWLrQBd z%Gus6gW4C2XqyRo+1{OP)k-FKk&f~d-cxa^pax|z;&Ra*?%rifOsellbwOMxi&uSj zz}1Y^voNMGvQ{EDtl3%(=zBS*yFdb_-n0S|v$pe;KL;fz%1G7SMd!t_c9d$eMh>k3 z)msJLi-iAD1m2z7q)kvexvg=8qcX3d3^a8{6>i=2wlHQ5s`|Y4l($;+uh=^PNbgfq z1+W_T%H95*yLZQTi#un?5Gn8SI84TO@BZ&xr^sh_54ipoBA=fiGvvR!`%k!X9*8LJ z2m!`-in|rk+-dLD$nu@Lym+U(y*qc)odqoz`=}FsA+*FAMc`J+4M!@!bJYQ?GKzqe zq{+#W*Xiz}T<+fCtQe`vZpk3*r?a+q*TT(s)!l0zL!}JjzZeO*15ntMjEY__6&W0I zML|b2=16_#0rLl`hqx^6YmaA$~Jj80{;=%dQY5mAY^Q>5UaEpv(O zoiC^qznnGZQD=5-yzRBN1bW^sVCi-Qs6vT&ESP`-?%XLhr^xRhzjtTr&S3M-olOqU z=5HZ4?(A{hL5>jIEx&VT#OxE~_mIsyy*ryy93Vpb@XiTWX+FBsY|^bws9@2!xOqpf z1kSaX-T}a`bmxjv>!nNDd_WUsorWd!0c?0>;IBcTJ;CF!TZQg0`EN38sSSxuR z9?S;eI+}|JMRDoQQl_C0!3KAwRV{tfC_rtHmbf4x(ow7Y>dis0>X_D>4`$A;4rgT% zz=Ed+abm#=zICOGX1H0KMYDN7OGnyOi?q3FV7G~bAiILOPqW1lO%PK1X4F)M&EW1$ zi*f}|!$b>{Lc}o|!7eXHrp>OrN+=N{zXi=VOA@=~C6M*zN{)#w5R}~jjc(CxztWxS zjDBlC2@W?O;(a5%TJDtwQ1Ige!)@Y&3-bhh;~nDjZgaRf*x20MINB^W*piJQg2M)h zH|EFza)wl!62HWviDF=qbvi7i<5H#Rpu0A*)WILe@` zb2P#_L8b@|RpdI;*{0GfnG(ra>$KV1*eo{&pl>D(Y$aKnjaHExo+K8e+pO_!H+q{4 z%?8DzZjl*t`NPp5;hf}HZ!Rjmpqq^afk#4T+Q@*kwgYWZ(OoA{u6A=-BzQwQ0hfe= zLiuEdeC71P9D9L+g_v6>z;0gY)&>71u9|%<#SJEz-r^V6WXYl$mOQt+((gt ztBtFIfLsvdCNhp1UA+gy6QSJHpPq<{PW$&~D0kwJJvqcYA9y zQV~Lq#~v!f2ReKEC_4y7Oi$47Gma6Z zR`7<$bo-D|dK!3p!5kD-2jsExZ*;|Sm*j$Xn3Y|billqDIh42iAS71OToEait9NsI zphbngBLAw}APw$|;nv(x9|ID0QVEh1G$Zz*K8*lW56s*|f1yX2k|U z%L;y%xR7sriIai?ml41<_x(LYRf*7WE^8TeolD zn#M3gL)5Jr0S;+zt=+!G%Wtn2Je^?~-R@(es9THn!Ay^D&8)6`9kCW*y1gJ2Y{e}& z-l9ClB{X^;;5CrBxjnqS$cV1a5%Odw@dg2XbNfC!L`F2U7R4Ah)pMj3E$XV%*xu4w zX%7)mpy|Y@LRCtSh)K7WjCq^7!pkMxmRA|=iD|G`vK{0M(R>&#Mh1)f*))aU!cL_I z{a~Z6$)?aV{53YN9k=54^cEjwh=8hFePWwiYP?4FA4`LK<$0&4`}QocR^F=E7K7Bc zY$T_d(Dugg&Fwkk%z%8r7@#(Ql7}?foLh!DyLDYt-g&qM1tC&$%(Pz$Q ziZtq^3hEpITK>=Nq~5n63YN?Ag=TF<%LV0aP{@|rT$NmK=9FIq~f3Pg9dz8VRYb%NqZ z+hjg-R`ZBbL5h%wKor?IHtP#!+N{@Nozq46$#5#UUSE?}yq#N{th+}<@wiF9Z=z!? zZr1C)n@m^NZ~C=<^CsuzW^bKAPSwqU^l5$J<~ox)EX!W77Dnn^mI4CE728=7SRn1q zPP2ZKB4kDD#LYTkER{p9Kg}#F)|v9sB`epPj;{$8fOXN;dMj?uEq7v;yWm6_^?Dy2 z=jY}^&eqOZ2iL1wN#Tn;xWRMrT?1~SO&O7blUb{R1{OEBu*zE%+$C@g+Gl zzoZjMkr)2rMI=Y8buBXY-*+DL$2z|kW9^&&eiZ`+jN{USWNHEO1TqC#gv>t}#c}3A zZR){;spk)}sRvVYIxarwz;Nb4n0kS68Pa*cKn8Kuj&rbr1^Xe`j$&V9RX}Fr*uuE* z;Q50(&>u{_#ESl}uvKmf`_I(4rf54xIQPHQ^#z)uATomV{oao#xksk-KVs>Wpr z=fFtX84{+NT5u%~!pVaG9*Zu#`YS*HFh%r?R2+1_j8zhqxX@Smu^U!{>cXy1g{d`0 zglt3?=ZLVF1E&qt4+@d&iwxh zBKoqTXaqlU6eH#-r_u+2MXT8&hO6tPN_WJbsz}m3pUMD~TO)vJr8(O^mbFqx$vsCb z{@{SjeHXIF()JR-w6nwx@=}4t|ipe^VCAu)325gx!GCQsGou3+{2Z3;B9L`v3{L~scQ*Q!L2Xeg%!X!2W zE&q+kexXeb~pWcfkHFqKYD<&))P zjrJ0H2IUaWOU!H=~cSK(+?!APS3M_j5~% zvqEiW+Q4-5f|;D%WD_&48CDo*2Vj0OpM1|uu*#oqIN@MoJ*?1a9;{$?h9>N=z!y>a zIY|o;~+bpO^lD16Mj6M7)PJRCnj+3j=PC4j$Vzw!{zvRJi^US^m7H(#CU=5 z1{VyiE7XrSC zy9ZUDA&g^MK){>9D}@AhJp$l-MhDpK0zP4-p_LkEqB5C7u6f0V3~U3PHnGNnO5v~+ z?WtogM963aQwMmVAG`q{b+O}8aPPDmu@~qP&S>NK%Z<6{_XiR~ZjjE6Baf2yXuo{i!7|8hXoWWz` zGq9KPYYKd9e4)pw-_pS=hesg^LiA(uh8;dJj&=uNj%2tb|AA-)2#a(ufNiO^R7cjH zr~=2_=#ZQ|z+CKK7;kA-#5EhK4$7T?Rw{uiPtqVP{!9VrtX}JMuVqHT8Yvds#-DI& zfL>A8JdFCWVl<4^N5@7-$I4Nh9uPO0jg4Z443Jf$V>I%Jzmd^87a09mI*P%K4bWy* zKiX%mqcHbVCkrvVJ?t=6gBA`1Pa=UZIv`wHfXd9|g4RXNT48Bnp!sMsW-XZ2=8R}Y zCsNG7p#)mPbb?dvJ}D4HZa&t_88f3q+;YsV8`ykcdD9~Uz0ATQ(y>vdTp?Z=*~kPi z_{$xw(Oiz=)Q{-IU>{(!bRBhsl@Ln}4%SYtkqDuIJuk(!WW%&2W`zyKjuw`S8zkqV zax=_#6oa|#O|_eOgfu2zOjcE{+(n$>#+OXM!H*6`GocEU$TLCpbcr?UN3zio9K&dH zWOQ_7WOM`tLu!~o%|#tEs?(8CH?mrb=sMa(oE)GiM$r5yxlr9m32lR@qa#7C$!JLk zg7b!Zt`L$aM{2Yh1AE{;WP3ut3Ql-^1foZQQ#dz)UM+TP6#Uo|_MGso zsw(N-NP2%Hzn_dOLfVjp`(dQGpN-s)#}c~yehq86IV_9&9zu08;_u@&LM>Mv(~N}s z4Fuf3FN0_F{gEzgO!7uP3D#0uXk2*Mn2_UwNDy^aGm@k8EW}e2^A`6DLt21g>3);B zaJL%r`#8U#Cou*)b1hLM>RyW4Qg9^5Zt#fgwxZ5=S9TzpUnuI$8bWsc(sSeSUz`dcs zyH2Wxf%`jk20&H88WdInD#)o2jK32QTi#ux6!8Ejk6>}L0&)y=%z*0dX7EetgPuT5 zN>r6{s**$m(FpJgu-8by-BoOjR4gQjFD+~dobKE$d#b>scbTOG23?GKawo6w`WQht zmT4gUQc%aJ!Dxq*T1Z_WXYj}AfVg1W#QwGn*54f<>if7EEuylI;yhfT*!*V=)ggPa=>4Bj#4>MO2m=9VJVEZUX2|nP-gdXb z?Y>)BQdQngZh5Hdx4HDUGZ-9n?zWeWa}O!u(~u7gDLoqupmUH*jmyq$47Y9-&`?S) zZ{M25bVg28Sw29_$7#5o-n#t`u>`0C(-DEGO+?Z1fj?>HswBC!4Bx;CaWi<*4^gU= z#1R{sx`6Fs^tYP`;=N!!oH1(-69~H7`K=5}l3BFMItpN>fIj5#b%t8rE|lCwA|zd~ zF#lE!^zQMnUUyYWp<@Z>?rnej9l)y#Hj*&dv|#P43?2*U+AtB);=@fOfcTruTQ_gr zyb0!5l{eudEyoO&t~BVv%?7=0%1jq?a~S&+E(A1QU>*)Rq(F2(ES4cxE_!=mFW;=~CQGZ{75SR=RMj52H|t7$9tT zSH5inunM^o_?xnnMj6|rNIC>XkUv)>LabOX8FnBG+%crPncqmhbvM?2d*jBp-^Tk5 zOdQnyM)hy*7l7|zJ1cewLn+_LkaOWpf=y2B~^(`=?x6b>%Prmlts{7 zV~iJ6n~NI=W15mj7!X`wXy3quBx+3JZ@lvsH(_mGU;y97uJ{)< zT9HI%e;loje$A*fnwU7a<&gHZx?qbq z8btUe7^=HA0CObF3TU@uj#*nRpspQlxipI{7ds8E{wXD$ieA9jRgfXQuILr__Qo9ruyDg?o9e+Ks|CORfJ# z-6ZiEp={Uv)$;2^($-kN`ZaFzU%RUTYmc!>1#UiSg1p_=;cE8vRd|G}t1x~oA1RWn z#nFL!HGdbDDRC#ky9di z%Ok_216KLheN^GD^zLhfa?wHZ0`?&91b#|XN=2$x7}p70SOzk6jCmnCK+DU~=jz1-JzzJ6~6;r54@&QdtuWE9H zs6SQ=YxX1+Z$w=NgXn@iFzkqK_1LNKcE!nMeXmlFu9Z$td00aj>HRT~&>E$TDNrOPjSEg*_R z8?cv*RfBM38>wXMYx2CTrDxow^s9^hD|az`HO-qPbhME7WX27L5wyi~GQU3C)0qOYn7theFfYAUGKz%zhVam`l8f~l@i=`W<`FSzsJ zLO9=d;k<4a{CR&NfrRtrh35GSRG!bFDWFL&z)+*o*{Us94}=E8FTe{inwICAioI}t zz)W0~@OKc7OBQop`KXMT-3$Ge7Kx1t)=}fn*EnTDawJ!y4quWYh!s$vt_;4ON4bf- zybX?_<}sjXuxB&M3z;&Mq=6d`f)YremA$ZF72;uUn4=MMtcj}|=ZS2E zkU$snYSTyqbb;kByc;pA1l4X>{7>Fa!EAI(zdYx@4CmTkx^w=^zH?uG$vdXu94!9J z^xT&oL+zZDS_Rm$=;Oak&Xri#5C*q8j$Z<)0W)BJ$yy2oXa!>0U%sb2Ovj1*{kc9Z zpz!Bf@FKB@{Em55&d!L{73tyLg)8#MHR!S|B2Wh33Z^r)WWg$PtizY3Qj-f5v1Zy) zkSfh!@Lvwl!S4N-+MQqo4N66DbwO<@k)V{m0wT-R0#(%j%Ms}yw7f+&CRRnVt0uZs zU9I+^{UzBkO(Bqm!TWQoSx!Y5#wM05r%-@eSR%22jkA}9)i6o^C8~@F?%dj{V50KI z-N8ol#t55!8P3+voW;$ZP0o18tFuA#GOjxqIp^rk_MbUR=d)+zQ=H8(Ep=QzTcf&t zHa&CJp9%Cd-!lae^N3Pl%;TDf9=^1<7=0E4qBFo0XPZQW%Aaiz=?o@JR-EnQk{W;3 zouO}s2H-GBpFT2APM@dIPcud3riKby_jASQV%1r%#!KLJ2{|ION&sHT35_j?17BPS?0vg2Najhb*05Jeiz226=dL8AlI!2KgS+ zhAco{Lkh?_NC)x~GJ7)MNY5om7vdnNPkwtcJ9Sd)=UBfuSvz&|q)hH4p`S)aX9h02 zC(F-kUwr=g7y0Mmi|~2!MG2Y1oTLA|LDT1-`!8x3z9^t;M?a5w2U1{Nr_UGe^9(-j zb6S>!z;!AA06(PpLJ%FxSOS(Amp*UO5;-sjbLWt1?tw9nHIa>1f;=H+d<`vEDU+!d z`pwH8$m#R)i&l&#%G(HJ-+?fqYr!H)D0*5S9OiwhQDs_FzF3BJ>GRbj&bw~p(a>52 z5SB%FwT2`Jsa_g?W@*XTg`tfVJBLcTm{J9|6OGSKocQd-XXS}O9C7FEGj}3^gwN_y zxf2&$6p5P^%>E*UwW_t! zJ^xvgPPjQla8KB?;zYj@LI~p-Rzh;6FkEtAN~ChVy0O7fMW(&o2DVjh^|V%8@)Iey zl&vaH6vvZKOG)k12XZ^=z09p<5<@N>AMfW}cYi$n6mTw@5ltWF zS<9(nqN{_tAXlzSWS}BH?s_GgF0jmsCP|RuJBWGU492JmKSgthL`(t=c_ za#qTtBR0vWU5q4Ry;g@+Q3+!HxVm9v!lxajVQuUitBlpNnRF_UeSk#40|)nM+d4%B z=1gvq$Ie$Ifrn5lBSD@7-eA!<_Q@x>`(y4C2T6}%2v~+sGN{XA{*!Pl{R9KmiI(A$ z&ap)6`ms-r9qT#!WBDij1_!M>RwpnbfZ2p2T}z}$Ai{KtEF&%%5WkPE^v+=}A%KB` z=>r5{g|dTG0Zj&12Sqs6Pd^0{G8}7aZS`1A5;}$y6&sJZ9KIDcDg2bl>887gP}2nw zOT}XX4y!E}xxv?JArXJ91_dx19FD<)ip-aJ&@wDM*;)p*RLpuYFehq#+#GjIZB=BU z+Jpmu5^f~K0NWrVf-Z@#zzc09UBr#M5aLFWeIdf|#D;^dh?AQaD$j&fRRK`L-G2gJ z<`I;D=g1&5EQo`p4oCeF2T6}&a7V(?Sypq#xeo4VI8x)h zix4h6Bmr=ak*G2j(F=OQmPh*{1QY?b49G<^x}&53P6JBu%UO?DTyb=*F~E`<+}zPR zN3kGz5T+XX3^V36ULmf-Q7c5jiYNaP+*kuS4hli&h)1KS&Sgr#mc_oO6vn|E)kQiw zNCEN6=Z<3DG1)41!lRAdqifzu%qjPYaD-(UqzF1~EZJBzPYyJo2U=M+ zG?LMANREU^-$AKvX>G772^8W+1CiL)z2b24aqDpQ@!^j-o7XHq+`#(q;g20uRCf*! zLO~4&YRkjnV~??mF&yrriPiwsf&vn_1xZS1CTPLn>C4+;h3AKB)s$#N4f35m%)D(g zb6QHx)b6l{!GByQ4)n>#`C<3*B1Vc4BRNKOAxn@>RZ)q+8UtOWsj2}@Vs(_KJiJQv zM5=@#zZUpCJzSTGuuE7EM4wm@-8xVMZbndrYDzv{j{a?F=diM3(vJ_{{zdZ9w~!aV z`1vmuF#f||EaEr?`Ro@PaeVWOqrX@>6h0~rWgi{-$Q`QVc<7_@Q1VfJsD>Ga#z%*! zD-L6OE3D~{o#4%QylfUyo&;!vabE~a##Y6((6Jfusrc`h7!PbrX%nRJI;pplS6 z8b&ROKsS<2KAM#mNFlw4j}a^@&P>=olzw!mufnxD^FvN-Stnsh&KaQ+DCr?lH89%S z5c3U+GXk`*<_dwO6^6nV5ws072Dc6ktkh=F=1n)xgr#blhc6j~Ufor4OWZnCsDlFs z4;(yzJ8s2+j@ z6cgxB6>Lp-7zS$=02SmxPO%zJo#?B$98=mDQXX6)U-Dxn5W~D3OMof}h2CrrkQ5lD(G8_a6Dgf&btYTD!;lu%oBC-sEQLPQubWognG}uGygt0?h*q`p(@AsAa!@kD;efw~C`|B9?@ALbUC}H0K z6}Z7%NF9F3TxaBd2VE0hboBc&9Ydvw{;&(E3mjtjeF1Uh{x!mn2Ss|L0grV5zC1bt zH1cDL1ffB6SOB5IzNX;!?IU;80e=rIE#>|i*Uk#A(XR>ue_0Z9+PA;lSE&NiTPqOG z>`9~^Fh;~a5+@)X=~3=)NC8sp>|ivL4*N%4*q_10p$IREF-;i}A~rkJd<(q5+B!FA z8I`sZx6A=IhX~7IYALi-hbtbSn#V*O{eHMuGswRpM`8&aW0fq}TH2LM5Od-m?>?)8{I*&FtRy^TG4_d-Qy3#?(a=NXncWD&9;342~* zWS%JqbIn7Fy?1pCdul|XE0NlOCK_Fq_rAgL4unCou(UCDAxnGdKL>dY?W?`%p1tke zZjav$p1bRNcJJP^+wXC^gEZytrZl_vba!WacJJxHtAs7Y(ZRQlh~4lGd-^paf|G}5 z4D^mDx*0B!irv3~qp1}Z^B~&ot{I~FG2V+!3s^M*k*tGsA%1td2SYB_WTzT1a!!PN zcSG2FmbGN88NEmn$JQ!MSnb?JvD+@c)5AcAa#xcU*yx(?$}si2YSfilw4wG0 z$akeXca>UD5q7?BU<}2~7PK2`vU5SFnTvtLe(Bnvt8_el6%bz%CQgB35VJ@6`GpkUq!uoNA322t%=tb9G&qMot#py=3? z5Ie;%inWJ?t*0d3uwXV6Q9E~bgJc%WLlZN)95M4BHaVBAMos=WkNF4}@=dAz^V`D{da4@2J>Tvk*H^rVyuBy969#~kz)C?@6 zkaO5Rz#wxif$N1`7gQ-CZo8^wWu^|>f3gx|Gtyuqs(LxTW8{P`3e47p6mTr%jI#hM z^5~ULay&Uo^ew1SEP(FDEbr|Co20I&i!98sN;0QOXA)u;wq@J5ZFk#}?cHs)?c26t zNVZQya>$~o=C+0Hooz)_I;=eAONw07Op(5)D50baC5JoVi)~!ZZS&ig<@Z8IW_bdc zhjh0E9O-pYwpLs*dd8S=>b9lZx6J}Imsgc%2`1*PXfAJSu$*m3M?+kc+xn!1frT=F z6eu00*uH&gTlgT^noGjg&If+0{~&C2AFSE>!PXCO*WrV$TgwkJEQ;t?z$g6x$^`B; z`Zz@er~lU<%3&Al$+Vq$35gVcG`$xF>87`)u8| zWL(q9R_p-MS^zgV!LDuDx&_s5DYhmU{g!vA*t&HK1;=vh00-T-7F&KMWi(4$84;X8 zL5Ki(&m0X2dfdt_8IEw0OR~kq(QmEM&26pI3(Ax*=3N3TNDvE-KQSmH6jOtIgeWoX zH>xWSNh1$;r+AyHsj zE^ucD)Kv!)*~jE)WhaurUluH8rN=-dA<_j*x%GgRgNmvxxAq$;99cvk)y(L(G%?U8 z@)im=Gi<5L;R*s-~j2gG!R3bT_|4%yS_j%!*@F z5vuc+khD2>H>aDyo2XP`Q8kO*wZd>xAXZMBJvJ#|{`ZHIP0Pb`IIbW5`S3i(b;FZ5 zK7ibS92+h+B^z6i60!hskTHmd(8lrkrgYQByO>l?FEC$*bfV60n!)Tx$UO)lUT%7h zBZFr*`HcZW?Q9gkDciVdV;3t*xhcnySeCH1anmM*YA80<;kjueJxFswk+YiuFq4gQ zn~1syapwM7Qv)*f=*DEjNk|vsH+FDbg3Lo&5C_ROh7IY)4K%eO1!Q4kZNtWm(aOj- z(J+OPaf=YfmXKUR%Q$2f@^~ZlTu}(fHAiB#Hco8JHf-GRt-G5VZyAZeT1|;}BY3C?j)BZ)gpn zEs|`*(1zuq+J>Q_4LKC$P}mS4ZOk3UVyF)eFm4#~8zx!HU7{p)SD4JRhoyuY=ZO zy;upNY#Z)In+>AOse$7&|oCO7O`~Vkz&cT z8?;oxLkmD4KXQ_htpXt9Ss#O2vNwj-53OH6m7!2s9aw&O&I!h+03JNgb_L6 zm|(20AJW=k9oEQ7)E&DKa?tp_ER^kXzrU03a|m6%@L9tWkj02%{=6 ztbnFe9@6b&I^GL%rrQ8DxZ#eiCB7|l0rXe4pP!#Zrpx0kO=srgWoP6sPz+9bZp*4pvuq~Jc%w7X( zc0IW)NjEL4VZGK|DHw?JRw;6&AT%{yh2_SCZe32-84-ApPP%TrTL(_-3skzAy@3M` zIO0!e9ZsKhHEN1=P18aV);G+Byz!T{uHT|?WJIyVQ{3O8~{Y2 zc8avDgD{lq-T?(8!Xv!=`ft}I|8N>|f8Ed59l>~S-DVtLu3N(K2ISJZ5geyrt!|50 zf4OcGj`I)){T7TbFkZ*Vm^bT=%KJ6un>0JRu7x>seYI{F$5$~6vHrojGdNyV%p1%$ zD&iNIjY7Aw-C$gxzn3vmUs%tplRjC$ zz@C{8u`B##b(V~nua6}&jY1_$7r-mC$kQqqtR2N2WyF>RJP`y9mmrzhi zdQW8}eLLx_425&!u|0BQ2bhFav2Jq{;u@ZB+HM>84+8%=;=e8YQ?S2WhdEDK`g%2u zUT)pHIzxDtNMP+&Cn@QXCjU*S&h`Pund60}UaDs;fIP$OC zuYXrFb5H~H&oeXYpERqEcrlaxhZN!MpI-a-miX3fR%0v%d$=S*itC}`jR!cD+J;i@ z++}PKmp;x)?HXiEW|1Ld*!vAqYKd#6Bfp}by4BWn_ia#nbWT`Py)Aqs&spiO!lZDjHAl39k z=B=(Pur>5kbB^>3TaJ9>S)x09e9lm{N)NGFAInF*Xd=&_FtnzM6c8VQM%rwOo?x(c z!{o;Ck*l%8Q!jw&X$l@Ehi_>!G*L#EjtU2*=DoWE9a^XrU2Cls-{&%*e623FSnr5*g9K6ZkiVjYPwZIyc9ZoV^eK-)289MO<@=>oetwQ z%3+5&UiBPa+LR4%8pcbIn8^t*c}4{z>C%ELUcMa03!lSyL34O{Q#y?4GYFBMK;|KB z2;CoT!Yi=Dc)fIZ#t<1xc?_Y0+q8ru(eX0s@S9Bya@z!0Q_{8E)Rc0Q_!?*GMA`q;o;3CRvy|M!g(o=bn|e)q%9>4iJZ9haGJqLNCqxM zal>wN-|*()%|!LXhDThl%v@7CQC?!~LL9`P0!CW>a0ZlOxQ{@%!_6pmXaL-@LK;dX zJUVn&{K?75kOS8Io*OF zY@7{z&mijTy##wBg>ROJ_iAv^_g9pF@Y9vV$`|SS_+|#*d5G_skV#!w zcw+)6H5`#5@?m0oH^<(#!23;D!-uYTV}tLbAX=;MsZwKrDT5B_Jzl=wS-smE-w_2dzDLOS9K+VtdSlYwodj#W!^n3T`F9;8P!|fv`Jwk3V{&4LEkCtjdzX?(ypa-V!;^0aGZ3AC zH{Xi3IKA6U+ET*Ecc}ShDc`(&j}S(Rcm`;W1)OpqwyFeVxYqoYT+>`I%xmwCi?XpN z4YmSr-^x|*nA$tke9PFJaCVC|J5F~iy^A>uE30>^vBLZGDjB)yTA`L(`6e)RB+yZy zy>V?Df%5I0ck9OrQ@k^1-ESd=Bv>%t<1Il>CcGi7oLjfhpvqd+Tgg>3*=^%Yhu<{ zlqvKnov=N_M_NkEOMLK#pPuoU2S^8Ve)^@-(a&#N%}>C@`!;+krmltGo^FFtAMzm< zJ~6ZnA1LDIa0p6pe2z2p4d&{omKwzW!tG}WD^1W2S|A4GD7S8Qv-mu?LeCPMa+B$Y%?Y=zt2G`p$^ z@v}w!isXTnu^rpsj}H?ua|bzl#q_55tPz3e$IQH!y-z9`O%I!T;J3X?PoeQhXZt`? zui5>AfD=9+rG|3{(LS+YphwO2!Ktvl&zuc}rvME_?7deFgUrF47?_Hm&(ih+oS#eM z=hS8)xjs{d&S0E@*yq>qDXlm!`Qbdjy@h2Pg3tKj*s{;$@so)_<=|nBA49W`$MFM> zIaMDDveWw{nm+Z2&%5-9F_}k$?#D(ev)n(LO0GC zIuCgj^+cuZjXqLmg?X$jil4mWM;iGVJf`V=Vh$@-%*c+$_*qPRx(!QxCexz$2}pcS zPD*@&bSFOjsSlDCJManJ9ay=Y1N;;yZZP^C4UW_g;AnGblbu~j*vXHK?!f16Exfa1 zwS4HxiGw=Xk?uf<+gXpQwb6yZxa0H8JDLLDiO-()F_6(K5e4uw=t_V!EC!zkriWJo zP4U^@9qCSxA~_Gwu%ix?9r~0jKg#NM6rh5SQ)}+z(-rf6qY>${67yk9^(k5P2(UX! zDEZ-9rqIV_yIOXHMDj}Nw0xhyT)%bXhi=PWy)3~Jg1blgf@Gm7KZwhot3~YOAQoC- z$XT35a>*kjVy&vY=*w#H$zzLy!NgF zd-nq5H3T0^-#rQGLZ0qQckM2AWxIFn#wV&VOLl(`!AI2LR@=R6*X|`7W^M5Jz*yRPxwHFT4aMgk^ExnfU@oFB0$VB+Gx{Qk$3sc8|p_O$`)&RJdn9-M@_^`DI zwv=vBN7{>BO#KQn2Eo@0y8M0wzh!`25DzIJ4$^@{v)_~9`vdys2EN2#j?mz10(3NM zcTa=gF(4$qppYAG3ogWCNP#)OBf&YbJ-&}X8-;n>`eMkQ-OCp0_Vf#mkoR5$L}x@xrC|4FmKReXw0j!`7IHPMYIPPdG$f5tfjJ%cpFd_ zX@&5s9fWVg#yJb*7ciLCIL`GfXp2|%{GJ6f{4xcj!cr|*8^bAG{T{YyDN+J0elbR* zW2a|eE^G_%4Vt~lzSiEbFWb9sFTVS=*Y9(CYy0A&&IwdB;>%!=60QlxVy|rbyoF*c zp(jA52z+Nqwy-zdw|9^*xbcoJ5kc^MD1fAU;bZ6plzv}bUic~#^lKQx7>k9~SHylI z)mt{M$)qnD;9Nq4k1vH$w z+`OL|7Na>ckq$AQ4Wec5zV6=lBQzFf$3#i?iUgZv+u`;O2u)y0#*?APhyArJ#aRNi zW82v!H1a@q|C$5)dE0*gM-JWn$pL&>??Af$0KP_e0AKCHm>j@Y;%LQJ`7otNa$p|f zO}!XB=k^cK%kY+Er%zoumg3lgGcgFe0O{<{5X3b`B;?97f4M(BV6%LGpXkZ%5z!zb zJuu-+{#7Wx)`u^7`UCw|QKXHctSkjtbU08Kj*D8&M`>Yv2%2tF_s6H8E^;zjBQ|wXnGNhshMmU@)SaH z#laFsrluC(;nw)b(v}}3hh9OZAv2KMAAO1AG9>>f!?)ULU(gB(K3bA)JJub}K6-;0 zea9dULL?7agp?oUI6jZ73mPBeIQLPL-^9nAxb2UA{_*U`$>E`ozryhvq>FVp%+&*} zp5QnNDInw0Ji~DwGWBtKJl@fI9&^f(7O)G+ueel{xkY}v9f{Zce^FftQ$bp9T~0O~48GKjytg+zocPlV5X@Au63 zn`V?8!XJQ(zvi|iwSIoBiz$EJtdxqsVaA`0t9}K|;|JpU;*X~3C(a1g;cuWJ$ui~z ze{~MO2WLtw1KjG0@XAaqXFt~FJ}qC|RR?F<~y z{WQsmJZQIH#q&V_l^@Bof~zWj^@sAx&-q(#0U%c3ul`gXJNTlSd5S;&cd9&Dp7JN%sc7nziz$ zB}=2{PBx`K3B_QX(Xa2!=`*KKpE+|HzYTgi!?eJdpGhPhqd!xlxj3_y1DvY>csNDi zw@aanehwjo2xnFaSlFk};KxW$pYf;hOQ8^dnqEv;Vsscer;gIayv8KunPyDs&kS&8 zH~JF8$cmg7gYFrs{F%CZnIxP}&tQN8G(0#lgORmjEs$lFa3&k$&b7B-h9N}ZO4ea1 zF>N?qCp4<^XBy;3*6iJ&IFK+ClL@%R*`WO7fMSJ|!_=TR`)IW?5`ly(&-Ba07L=f~ z8mowp!6T%POKO*`&ntCxVGk8uHsZ|bwiqg}b;g~ZGXz@8%Gr7VR>WqEulBG!mzh)$XjsJP&UrYtF?*;LVS=C-=3(X7(L6ajD{tDv*#tVK zpsjl@1Fk<;V}e;23C%QgY+)o2x#9PXF{iVwlCw*)(!TV-bCH;0?bKP0y-C_M$M=Tm)W@BdK*EFF~z1SEXmQO#ccpuk+du(iX(q)eo5}DqE){TkKgRKAK!ob*nwYLur>a4JhR!a(i4c64`}K4 z`U@Sa->bJ@!td%@06~69&(GMl5Xs9Ckhz!mua>d4)Wt<5qoI9qkiTLd%PDEFs{nLX zrt~8nXO{q=2YI%nX2~A8GJrT_@ciL>BDzT22z24xz1ZsqU6vJZzt>MQ+gBG8cd;o9 zG7;0Z4Qwi4(Whl&mm7Np(V4%yuL`VYa^g%s#&4YbC8tX}xJ!jDCE+jCb(IKe9WP4Z zF6A-=TnfVBvJ}ZB4->Bg;d$iqcNYpbJm%A`+KM=mi8{TmXYW#ijHzARTbL z;;L&^M0Y|uz!#Srb`1-ExdtdW>pB>?tVI`~B+!D6{7TFjF$gb`=HPXW3_ul^GcA#n zB>SN<50YjPlyGSkgR1LZl+1V;p`cq`OGDqERoNx1ye2rV1t^0*8a>n3-jj9Z|@1!CXPOeK(w zw}iHRrFay&WQe$4iaXq}6+6og#mj;)pTn{a9Bvf6I4LjJH6hb#2g8-l)o=w@8oF{- zH-EKu6BBM@A4OGjQVi`V>0 zzIg;$g3#+31lOFxaSn1BvJ80*VaDPbj}IXybUiH7b+KNA5SQM>qAXu)@LFfp)zEka zHeC4bIxc)>mtSjD*G$88>aM$ZakW4XUSrMST4@1-WsW$z?3({}@p?ZYd382iT@6=T z!`Qyw;7IrovAwR>X4htW-;8pl7w_ay0-dm3j2U2b4L1&bN&q+0DEle}@&Kb_Le6<@ zIe&e?Y>XnFhm!a$jnUH#xK`fv^jiSxDsW}Is2nP?jG|Q0B6$}p^s&Ooo1EVzgUHA7 zGl0QrASqaPEHk^0tM$Ppms|4fJl3JYT^85m+qtS37D~@*vv7$!0(a1pcnv$_7v#kp z3y@B=rMz06(?$0bR^CW&-oOPPZzPcV%^Npw-oW)Mp-FGx;*F+oP{7OI#AW}e$A$bb z#q~AiTHLHL3fJPip>R4js3C3>N8aiBuFYk^0V@X>=B_aiS40$YFBdK*xsm`ENrbi8 z%U~u(7>`w!(ZEU1-5f-Q=np4cgAj{S?g^5;D`Rxf92cZi9LSTLl}jKaX+~TV@n(ix z>;XqyCzF}kA`(H48@OyKoN!r2I57y91!Wqx7}sSqC#=*_df_68%#UkzDzOn|sPHl3 zdXXz2>S>R!ka77;DR77*+_g`*{wQ>=O3<$atj=5g@u&v?c`5HyO`}#Oiw#KX(5_j< zokv`}Vy^MywRo#b_wwSzyb3RvEZgK(yu_|0BoyWU=jDt$;P8*Vl(7}^|8gPYNhD{7 z>?*@@T)BubxmC?%$9UCX*2n-h9#>eFHeNTGS1$q1rIr=-khg;BrTv@@;R%% z3nh6kTMH_f&K;Bp&%4NK{W7AsqCIeysl$!l7G9N6fafB#)s3Z8=Bwm!l$^G-oNJ%hJkPa zk#(61&AATubEOIQ6SxLrQ{L-?8}Y%<-%syh$e{5tTyFQVL^9^~@~1nzdlmWneJq6c zo@a{)@au>`0Rvl*Xx+gW2+7=JTiknB&W6D-_CUoHk@SF+bbxob-?W5)C0#lZoJrn_ zqpHRTXVrRfVKW4sV_6rDZGe>F?fTIuLi&4U-ecTpXBKgRw=*R&*WKveiogs;! zPLm9KqsHe_Gow7>meG+;rGkm792{(?Vn8W)G*Ky>+HKBuI+*jIR74mBA(S&VJ~lQ! zKIX?8m|^b6GYo!wPzIW~$|1>EIbMwA7~Ock3}#DUt8rb*L^Duf8^?@b)Q7QtX`mF8 zAMcY7%q^HLYdP)^LI7%*FJSazA+D8Y300ok>3tETf-HCnme_8-viFG6!*!gE4|(L}qS!<_uw3 zmc|U^`y9e?24bbz+D$G(^BO|xg@^?}sS{L{lP4Y|-`{*Ng5$>zzQOT1WE@gH_#Ve& zkk*4cIOdR(4{kjO-@n1E`(WUQAAi6dw;$aP$&dbr4Ab(5I<>vg{or9~(hb@c{7Q)X zA^e!qxkj~@hS4493*!9XeoW*|8zb7p5QurxFUa3x%zs!z8cbnMVpPIntjHo@l>vcc zz}h&2z>iog|In~V|6>gb5o{3cM_{uyvM3n;V>i|rRy;d$`PC*AYzA&iNQrX0aO)~N z5mkEr!+`S2t!)fZS%S(^Pz8@Za$sSEcNSHsq13XGxgc3kKVj&Oj3f+fyZxXldeK%i zTo^j9etWpHFJfgSva#)Ihup*3qlXV4l@H(N5buxT%tId@`G-v!pyVpU%s)&XxrYsN zFCPUh*IHD>z`{Ko(1MW<{i7N|J)F}=58b1#<&EhH*a3KMAr|JL2+AKG6&OBqR~{&?CwPNs{;4XPebm#|ZjKX%gra}P0Hm`-Uk|)IkEIc(N8sYI}E@ z68I-i{8P_ZIM?V@JV~EE8I0~2V5hG`4sRZgDG24B_7Ro7mWeR_Nk3K8A~Zaya{_zA zw4F#PeS%EJt~X8K)`T1Hr8s$HHKxV_uKvlp5k2O{KsS+lqJH$71;;LnVS(W(LLJF~ zjn&MMuu=grj1fmU!hsc3%|IwLY_-rlv7P8Om5`ZMu~<4%ls$`4#1j4R6#Sw`{-lro zTsm!_7dm5N#|Wyhie1GlR>a*eM2pQ#o-RWwDBIW4dQet7P{@N`2F0Cy=h^dTz5Da$ z?pb(VJgZap+&}A=jfebM-*dR(26K>Gc$PkY=AQ?8J*Vl}^Ae`;tc1B~3Sb0iGZ+JP z^72|ccqXtX@OI{dBQoPgEh9U?7YpJ`@1NI*!C*6IBC2#u@_e;%u>gfP2x*w^S*Eku;^gX zq56e?S)+p15)1z#zz|-B7yaf5cc(R@8I-)tA;pXI<%=8vg}`YdL|ek}8pADTfKzzc zK$;gX1(v=LMyb%Q&;xvd=wBu;7NLMgL9Ptx%B=u$3u3D!_!KXiMp2|m98qy71!|la z>0UUivx|l0rRVz~gbd^rg$N$>>(YBdx)+0QIko>0WYG>lWmj^fDJ(WtxLToB$O{y} zohYq2rKprhMoQ$`>si~T>}Fw8R}EFo?11{XGQ4{2U-iF!_3HJj*SP1elGpB)f1SR1 zU0`spGARA4hB^3GgIMAw-_EN5hw!?Dct}C#R}Q+mJUp=cD`{clJbevw=T+0t;7DZx z0462KPXu4(uryE;*UQagWC(c{2nnwk%o#P6XAx7d9{SKic&4&-mnD%#>s1Yt*In6& z3yy6#8SND{`_O{E4aZglG#`}C<+N#^@UMG#Vho92F7O#%#D_=KbYppF# zoH_y|ZxSfUjs;t5nG5W>LE-hntM}AaZjCBq_sGA9xn8+9$;|AVZ05~O8#At+zX>xX z#^pD)nKy4{rZFwwq%&{kpr4bE^aZAGWJ?sv5N9DT-UKY>A-R-v2y$XTSJ{@LrK45n z4Lv&$AN6Fz6mzn3M!aQ+m&VeOcdl%VC40tA8;xgjd{Uq2;P5Fi<9DF8BOTSQeJ_8&H~E@#sj3?4;*7O~kbdeiDfj}-=K(GuLcvwl9z1xPtxo134X zbMxukd^wlSL*Zqp&r?q~xzK7V2NnGMd;&r69DVlYV7(Z-~1UPLgGTM1M*m&Yvc z$}@Uv?qLH-&aJ+Rd6r;Bx3DL;b`odiQDO*Dcx+7g+@ zo;#+LQ&pLpfA_5@5@x0XamiegCXdn|vfoMmZuTFg|6LlgKa>8o?5F8q_Mas?v;QFZ z2ibp|JkI`H`d??inU18_v-i`z*}s)$+3zRsX8%L-2iadwwq}1TS1xvVSl8LwIgW-$};O3)$~ye=vws=7o!P&e`eaY``{~{E&%pY>q+7E;O8)O`Ap5h)zmxq=+D-p3`#;j( zNH1l-oBUVVZ)WvmbM`mVXX&3t#aq+g%Kln9oc?b1chY@nBm3{OKb`z@>3sH|q<@?| z%l`T7FQ&hpJk09g_D`Zu>$1O|K2HAW^i1~OroTx3Lb?sCe>?p+`4`eZ$o{G9?`3~7 z-IJV1&Zd8y{WSYq+3#ilO!|K&W6A%X{`vGy_7}4MGW&1R`Sd?b{{3Vr9nStND*Q|7 zRB}9doxaTecJ`Ok8_B<({?E|TjA zBkKGrIh+0Y?9U~?lfKISMshvfp8eJIFQA+oM3lSuOil(mzgr zFZ);1H_30Mx3WJ(>>s3M_MfNUC4XuW&vUwvSA33%r(938qK40a3O(OkkWYBpmSzdZ zH;_k=2?(Dr(u2>Sa;=l6^BCtKd=CC9j`VrWXI*rhgfPhyh$ZP@_WTKhn1(>}d}96N z>8uT18)#r)foFiNC*){3`6QbexN1R|nSOY}Km7)RC;Zc3I*n(6(@!wN%N7!>p7`nJ z6DXfNnO>3=Pi3POFCsnZqk)2#0^kJ=Uhe3jfWb6+IE~!UaxN!102t5oi3~Wr;sP_C z{7ye9ryI%!D`{9V27@rXj1t!|BYESAvRD$#vZIX%P&O-tv3M;?ag3!_4y@Oz1{qX9 z!`o@h+I`XxRk4V1Eo7|-;$?v8Dn7u8Gz+Dpg{8D(vC9>!w^|pbSF?+}@epgU9YIUD zJt^Cy0k1TOC|liC=hy)2RgK|zS%VJj7b|TD7?Xa5F_E9f>o^hyU`pr=(=L=&6kAHC zAV=<1z`B4Z=WG#(*)&W8Wg0ec^cV(7f~~~S)5ca1S8iQ%TV+1-0yjGcNx^uj28LHE zvY`aEmW;W%ksOI3D-_K81Z8xf39MKwNG^HOf`&WIYz9kiT52Ldo{2203(2SJbkG{r zy6Vit*&{0%u`k#>yJ4sbuzuyTqc8stZ*TG>$+qohMP+4WwWsQwdv%}m&;Xe7U)~8L zzzob_3*MwvkNQMk}LK0FnS$+2H>8r2oBElQK@3*!`)_cNa#srJl?%VfX&2KgC z85!Zeb`Q72-++E7&*Ue%>Rr#+@Z&v>r^!LJ9?MVCWCCh2Xx4Ita+Wb;bE}BTWf!Nn zCs}-TiI~Ej_*IDYK8K57D5n0DTsS$V5s(x6?`Wslzhrw!JEQ%p(=E22X<#|IqDg1F zI$f|mpeey--`1V}Yql4(a~gO~KGA+XeZ_X~lspSH7XrTIMCFh#jQs+cx0|S1eK}m; zuHu~f9$4`uV0n5|YQN3B{u*1He!(sMaLU)HO{QNH%a$)zYZS`*mbpJ6j`=S2`%t&< zUeh0#E1WSzV-zI1GQ{s<*AS@E8N|WlH{&Fz-#z17Nt9nKU460cSH}(uKVJjacj-6P zI($yt>mn%|^f1MtOZ{pKr>wdEHrN@@0M>q<*(=SYXuswBh6j zWy$QO1R9obHFVLL`N^{W^!snP;%US#;lm+p$8UZ)7)~EXY*RqrFS2hpZ6`7mDtjtG ztGjYCR=_djyL5l>&~g0Wp~Nye+F)5Q1?bCs>wn3?XPV!WPv7+0|0J&h{o4P6)}LIQ z+;nK*`}*nEfV)yK#&#YWBPOjsuH3Gflhfa#NvYk5Tlvq;$0#`GXwv-dL=`zq!bbEY zF_AtA7~t1WCy>{#EhW8FJ9Sll4Xm>q`zwr^!lG4`ZvKSgj~GT=7#H+!qBjShf?U&d z!Gu!$WrL%_Q}R1n`yB|%`sJfE@+0BNG2LT4ZRag{!I*nEu}8%52|r>&qD8k9t4I&|CGg}?)Rd~IE3AcaJlTk(lMolfO-H!S zKulmzRxZ$GW#Hc{c4;gQ+uutQ6X?QNDNW$00MyxYjYizF&n>e1#kGTq0GW5sm zOdX$GhGfZv+W8Ik;PDRd5dg<0+2lCEAAt-L6Asq~sx-K%z zAE>6OoX#~{NOK0imP~$5M*R1&PsY6A4`y_Vwx3AFvxI>FM@iXy9#za$at$Zv&ED{7 zK^dFW<4*~Pr1v6RfZ5L_$dbd;?Rllz$p zVGYS-LmS(iQ=S^vHpyp5Ja6(cQh(<(5_Fvw2|&eE#*%8tD!=aHLlD{cnf>^Pi08-d zAwS7?tKMhSc@KetMXuUQ z1$zg=?C5iKF9d?kMK!5!Kk65cr12s%*~+Sty|{p7x4FPYFcYICpAh4o(03D7$o za$CvZjSFJ-wh8YZv3bXXH(qpgQvuL=BuGJbK(Kcoe0#%!_kDP8!Wx1W-jxxV)BP7} zIP$g$Cem9VVhyb&N^B%+-4HRfTT&uHq26?2!`Eyb`AW;3D@wBoY;^-h-83SlV3y!U za*XAV41`UO>OUWGM@#_41NJK95aw=>+*i|7=nXwH9$(VLQn!I1z(}4Q{Yfj^YwB>U zFPD?AZ%7IP?-H4ADEVudRyZOqM~v1D9wn@YsYiF+{vj5Vvq{lCCL^NDGfkfEsyjuD z4j1H#4f-O8JwlJx4v!A8`0(iHaDFs9{7eJj;nvY``00rIr;ZN63I%sT(azi6+te_*fL%cC!B zKhoaOxWxyK5zZJR+SdIfP-3wzpu^WpI7#9}@>S74x`uohy5Xn?^3@@(J-nqghjc(T zL|S*a#t80pA4;@3z#Vi)3mCgFF*h*K9p2O%9bM8rtQtj{!o-QL1Sf8*MeW=kgpB(h zI8sC7;YORkI(*b-psg3D6CzY5?2a}&)TzAt3~^Ilfb~krxacM0Og}t255yRtuLW>F zl1n>>Bv0XT4+&cND)OY|4z&`e_YEdwK~Q?jrzVn~a4cz- z;LSNoav{dKdob5q!G<1@za7rJz4G99+5zqD;ezcuZvK1E{wz01{)>!VdW+-XfzzL9 zUul0s>kn~yh#mPD2Imz@><{)1vFP9n0v$Q0d2F8~4uud@`03EmFEn-R(asocw?rNu zcxR@!W3n5$`*L14BevTZy(iQAMcXZuQ1kYlMQ`xD1DD6%NXng;x!Y1{brWUo$~>rh zGuu6=%XYJ5*oMP(`2ppPqVRj4WOu;rl^HHIs;Wkk(%;CON*>Y6+noY)18l>`ZJol% z4WaJP6qI9b?;LT#z>Tlo`RQ%29lYUaH>1v1x50J?-vz5$qep+Nq$9 zs0Lk`X(cv~aB*|Y5fy_&3URK+71Zb6*8=FR#U=pf4EqWOiBBIO-Zea|FgnQ~viDC8 z*7gtf|K?!a|MB3)!M;NuXxy1go9%z1UDC*z{euJEv;Fgfk8BaR&&|Lge#f4hnKSmD z{nvw^*eVJyqG7iGnAROA=vUe~jk|I#YF5Y{(Vp?z0tX6_dr-qZ zz&ffAO+g>FMF|`BiCQ0c8xjN!0PhxMsh{Mij1=2v7knl0V6lH2MqkLmd(bFdo0`Wo zF>J)9xZ_d?h9cZ|-w{O>j2O|y5dBsHhj_9R?ZD&|9fe7B_W<>IbMSC=;82Bi3E7B_ z1lCce7Rdyx*JBm?h#w=qXu5s#uw(lD{%j9rdmm`z(cTx@r~Ps7clPHr=kVtK-Z32l zxOd1Nwe)LG825gS7}A2r0e<0lv44x+{yv1`o&;yKi%fsn_xLMKZ3?=e;U}0%!8v_= z6=m)fh`$h5*osqJa(r&oyZbj)cpk#v_lLbpCg<$&YW6rIcEK?Efqy~ro3 zLVD1ImBKmVZl?>0vei)zRBTUFmJPSiMrJ!jDBKrsy`!G4+}%UgC78&KS#Tu~ioLw< zmNsldj+!2}UWBqa!%Foj5ab1{b?+AfAyim<34uC5Uj86l0vr;9&~bEyEai%W-c5%j{X$a|&&;g) zU+EL^uq(bq4!fKU9Dyip&R#`we?id%3J=3kiq(yYY=tQId{1dMN8}OI{2EZVw=TAb z9vTSZ&X@vjlp(kd!%M&X{azn=%KRFAUrVAOH9^p8NL4Wb2GH&$L+W?vs$neEpP0ef z_+TC_cc9K2EdxzK{ob9xbX?E$X*V%=ubZ^N?u5>OrIC#xE%=#5#SJIR)2+LNbGaLF zi%IhC-U1?L5{g}X!P&N}%3X#A<#N>FU&@1f7NfZe@v zBl<6y>?a4T)M=4$SvoOqd2pV%T zU(esz&Cp8b&Uu@>R6|I|-TRS`3bjlUNZv?98Zye(-zK9HSx zh3sZZrIIXnH{|0j>WQ&tZp$Hq3P|*w%a9Z{Co?~kW?2+5i76)lO4K8gN5FB0!m|K9 z@r-PqFWg1;82J;wPAVvp>&j7>K_lw~bYxtyQbmjtMX38`J6B8#-u_2gA(`z+#{-U9 zz{8WfH+FV;cyafVuBdi)`)Q5~5)(Xw2!>nbje&!1=T5U;+F@s-jzYL7-eHGy*u4rD z9ZlegM(OPG6y@$R6v{67MX#nYE`?}plGVZ`^ly>!04F$Z3(7a=Bm-rb5{KQ-G%VvO zOj^_2?X1TN#fiZ^k7^>?lv1~Sk?^1gr?k99$EUxD0m`rwGP|CMAy41tDcS9Ma(0BGZ&XtABXJ3M5paU{t~Ekl#dq8NAnst^bE zYSTo@SS@%F?^DQm(pa6^RRrZ!r^;bvq?pFmCIroMB}s54@e2PgX%~pdbIRxfMEt(c z_q0ozak!v;ra9JSf4hixwiP3p?P_~1o+~C9ot>j#(OLyzJ3>^hzaX*;GYx9{1lH##@q^r*C+Z{PIbTFg=crK6Cu zf_*_Y-O7aXcDBf~4D`vUWehLa!oAq;6u%Q3TDmM&f_~A|=$#QS4BL0Mwt2bXNq#y! za=tZguQ7l(GJ;4(`>k6=#$)*m^xHSLwzs#CvV{kkx5+uRA#;ucc+2fZ^lU>9>(&-w zgQdt6Q&M@*e|zh)P(|Nz`$6MF9lhoDjV-wDikcDLoJCvP8&1+l0#s2p0h%(S-=5R^ zLGn;cZ16p51I*al4phyM`%jG_6UD85h4x!K`>%cd&gwR?26OUlPgt8%G?za45AGSDsf~|=jx9+PW^HB8VwRK0(GbFf) zp@#{jVXAgdp^aBsM>!=RG}!vJi{{W6eabp8jArr9w!hLo(w5o{t=n_B9H%@322*@s z%PmD2w%_Mynu!qVVnh&i8@8#sfuLfNnTimMk&9w<;$linDc_~3@FHp*Q^~M(%Jwtu z0{(OM1)}z6j9pSjBdAs0l`+zt&;+glvC)7L5yuW`VtlvtpID4ys*Yi0iaKt+9JGyP zEN&G+Pg#quHA`HKZ|_P}%vJ=!^$b^qj1E3B@9i2SRTac?7YzRKnx}e};jk`7k3fQ! zJ>@qTwW7vNdx{#Vrg2>!WGdq!j;WMKz@=D;s0M4Bh>h|ZR^bp@|MqqSXIh~t!I8om zHI1b*IaL)qkO@n@`jw{C`4F?HzbzZW2?1-$kCbvbSJq)m8MQ%2O)9-E9^!O6)X`J% zkX0>}IAbc_f>uTI)=LP?(EzgVN_GucZv`W#0xGSR%3w*ADsIw&F11QTlKLp2ak5pK z*?PNR%1}2Yok1yy+G~X8#ro&Be}4Pl62uese}4Oyx0Eq@JG}Xi-@bXvn^)~uos2s6 zhN!=xdP>M;*(hqpXS6kFx;JZ~8{LPR(Kr3ujYxaLeDU9zbTD!UN|h>~szvNOFw<0-C)*PtbfaZ@)R72<>$zJnsF^hUs#mBaP zOJrimn~KHCS4El~!=M-1^KWU%d9J75# z+okQjdBgUS_CLQlVf&u8Pjmj`o1fTzZbz1Ix}u$C>=oMu?MEtPJ)$5}sxeuS$#?(y zZVEivr{q&BkTp`RX>K(t39=g~uysW-sYTHjv(=?6^puKS3ZQTlb);5xtol^tLP4pp zOjd*~6;dKvxhswqh{9K|QDHSP>UT-PrfOJO$I8aJ#6H!+tYeh|V^V5O8I`J8=?+C< zDY91Hs%m=?r&ce_8d(=i_phx1X6dTPOzE#TxZsvTUqjrz{w{#U6h&6mYC>B%F@!+w zt5xtqn)SOJX~oNmM4Dw}R{b(aCc8Q?SbobmFu0PZieN_q<QnmCkRPvJzkc=G>kEcXneNyxXp+C9IqulS>npZz zX$r$-+5gP`;PpqgUueJ5&S_H0^E>VHYn45voxi5C;A;?30q=EGQ-6?ybq`)I)Ax9M zy?BL>*;B=@h+n<#UfqW1^($IepkG0<##n@shY`xrEr}eKL3+qLCttm$jNj|q8RQ_8 z%)Y)50d!YEuw_3BOughITuSKpW1Nm8_lcEE~4epkK4*Ei%Gk*ATpe6^7| zL2#n!6|zBmGoY3~`hr|;P;^CW0mFJEOT4nZ5Qh_=Q96)D#z3ggdV6YQG>(vfT81I) zHK(DSI`~lX$rEI;$2wWTrA+QYEYR9(BLvO2@(T@2%ux^WYdW*kWW1nn9Y|Fu8ptm%+VRiqJBw0M$k7s!=NTWHpxMjc z8~q3N%2dH8XwF|<(mSQS=V+QylhU2DEnW#&-Rc$eJjVRWQOrsKN{fYBR)>|R8|PJkuzzj%BnCUtFDT$zt z%a?a1r;=e03r7gu=+9Ia9VAPV=;UR2ZQlH^6?!f&y(Pd{E{GUseb!btwd##lxzfu9 z`?3{XU2uHsT8_n1Rl0J8wP9bqynH!(vGsE8#mg5T>0$1R-)MN}#rv1|iMiQ})0g*O zynG3Xo0l)nUT&;<)Zcx11PK*RU;ILoagX-l`Ej%f*XF&XrfvgP?n{p01dN7xyw<0{Y-o z=J?{_Bt(8*1!9Cp^R@8e#Z4y$m^kyoM0QJDP}p`a?@q@rUM^q!we-{UsvGEW8Zw3# zvzPyoWJOxU*N4@EN*G);2v-Z$x>HQx9pT?9_& zvpag-IrK<+bpTkyU)L(}OAqw#v=Y=Wo&%Ih)gwe}RFlS4&lk*FlsZ!*Om|afI-6mtWWBr| zeF6Wvm8f4VA`3Z`o>ne}uB(7GRje)bZ7WLAc%)7;;yGb_extg}fDuqoXH**$E6Yvx zp}*aVVrk7ZW_qC~%4TuIY0nc}LtQ9_7T?)(!47~G`0Z#6JjwbDMwsZCjeLlkW}N0Lsa0j! ztIGR(B4R0ZBlBaTQ)SkF6SrmHt+8%Cenjc#07&_FdCsRKo9ew&yS-6cKwULI)9inu zRW8-|?;Ovq*>3&wMGJNWx7z9wpJPdtcmFU|Ul&WO(O%&zaiUSAHS1M%MpMFBB>(>W ztO~ZPOhcgnHUeU3OD!^e=_65K>>Ms|rA1Bm!-0$_cmhny~@&o?nUsy8zE ze3QcRj7c9HVO$F5IS|Sq_xD2{L^VOGA!h)70iwiz@o3Grt(kj;yZ)Btv#2gF6l_uf z+tx*jScug*L|pg$`(}WXOt4+FxjxPV#u_s?Fw?{H2lgVv&GPx9>N8do3^m#~W{SR%HRT*fZ05u3M)PhvI1 zIJ?M2R#7h}WjcC+cFfpJ%*M^TrBz~2iYrMqsPw9_-@F}J4A*JnP^gxOTH?fr(-nho zlwF20)a1EUtmv4|%jt&TglZ zrf7LNv?08L`^sV91i!NyY<^|_>Wv$K+97k@re z%CLF6381^Nk|qDwNa|3dZ0vc4$HREW{%mty-I1%HepB$jY~G5DXYW<@4D1t*@!2K) zP91r1@sv_5pJ*Rw3b<}#=JW~)_l)ZUFve&1Vl0w*51aSgX+N7GbL|LTfD{qSyU=67 zmxvjj-IOPTf~Ey&zj@h~G_=;pp$ztaC?7_-TEf<^)DJ0{HnX@Nw zKr#jatKd`*O!|+MiXQ!jX>Lih=Bd6#wEUFlBs<~(*c7@U2aGzdLK1sso6V`?Cd>0+ zfQea{l!bf{HO-dpH<{wi{)Yju-Y1|%6cludk_o2-rl$gv_? z^RQIdP`vpmGJ}=%ayH-73=S*ZWY6M0Lim}(FVBF;qCbIgiAZUrXE`90p0$~)9I=iL zsw<4bmR9+nS`cQNQk>H&_zqo48IV1Wx|M#D|bMJ&}E-uQL>Pky*ifNzd_j zH2lE!9N2PxD4`1YnTg@)jb~3epta?ET-tId#%K4lLQ|GSnwC^@c%Z3g%o<6HXDmnb^ywFdT-%5jhCDrE z7BvJM;s?rcDsQK8V#t=yHe}}Ax5b#8wJi&pJTBkll2glP1*-sxT$xY@fK1wNoBG4F zs*}zUOQXGP%S8oXMaHQ7qo`UGtDp=|Z#Tv!Y=O28a?Km*_fNlKZe)Zjc4=X{zdozt5p*?GrkM`Y`A!FYdGiTtEChjXQ1Zw_;1A}luE9sL#=Zq--r%LX^ zU6TdxENn*eDp$9@2*o3BsZmwQQN1i4uTF@k8M=5XU~~2hO&A*Sdn5MvI2uI%j<$g6 zD|^L!%?w%fd=5gqBAgUW>X##82RJb_eZPIHN{<;fjD)EjqzO_j4JXOV>^ z8Ii>q+%FGXtfkk4%up)9xI#TVy%iAQ>KX`K-i~KazC?cal=Bd9rBe;kXw$M}6NP{T zy|bU7E~l(aAe>sr1*=)@QF&;Rclq>=gPHF^9@H04`zRaO--`XXM$7sMx-*>zzF5Q& z-PKr@az#5nxhb>L5!=(92PMlpPS81#o~%KphpM0&$E@Ny&9TWRK^!dF`_WLU@B`~;(w6099rHth4xWO<{CaSa+epG@(?d_* zZv?@ub`v3vRj5oJRlZAKnZnR_K~C?&hHNyaF@3=Qv2 ze1KhSWNyS2&iJq`^INvKHm{1Z#O}Qqg@2kO+p@q}33w8gF+^smVAnCug2!#?<;lY< z7lUC4yPnVkLs_c3hsU?03DBCv)j&3N$M`$bB!m-JNL^Z3mcA0A2mN;$()zrE?mF^W z{5QU7rkgUH_Jk9ajj0a^onnv{F8l0UnY(=Qpbi=FUCT>P8q7O#q6wOKw0wN>NWK*> z9W}VJvi`irQO-Gsg>2}HtFc9})Fxmpj$FE;Pc8a2rs!2vn2TH`>tKRYXHBi*th>z` zeQ;4ag(ZoK_)D#cS+p79dd9R*#FJ%B$6Pweue2x}hU!mDe}j-CUkGq*Dzd+tp~?C&a@VoDzXXe{P=0$>`o zO9*KAjGb&>FxS#97|UULgMT)np&Tm&HKM6`2%A_1olo0Y%e<1QF5RAI4wqRMa5a)e zVvn9DPcEQPN4&0&t_>1W87MUS!;^W-8qCj$fruEXENK)~w8fhX`9!G~Bv6nx#L@8A znGno{uu?J?=7vZoTxZsha}dAAwfQ?{moBG>;1wnuS|kl8xGNt` zKt-XE-$&53G!hNw_q57o{s~N<{}NZGm1D;zADF4&PiF#{oxGyyu4(d;ew_ne0TZTz zFOdm$?KYiwS$>G2T(_AQlTE=2Dw{Qme@;18f%A(b-IsRch;WSfM4^PKUs5?)^rza+ z>(p?(qVCnjlZ`nCRkxIefAAY>|Kb^p5>QEBE||`9C8^OS5)quy6zHCm*WDgomj1%b z|L_s)rY^H}-l6YH%q)mj83B7+y zdmX!^`jw__ljo0lGCIBfvg-Z$@n0T4 zWA=Xv=GXKNX>T5DovHFa&^|x*>gULR`S?F)Yc#sY$87cdkF@^rGgB$k)nV6 zzh+zU5V5gwuM~Zz7ISAha~;>e&mJGKmBRd)vgM5)4xTAX{x@drA3s*FO+Jy$xiYj< zX%hO1VH4n5+2q{S^-Nhm)0Ck0Ne^B~42_ETDmjuEf-{JQ!X}6hk2Op^?PU1{e)3Ck zI%lF+jOea7#Y(6r#HTvtD>=Pfc*b+WD^Cdm>mINEVCX+Vs8|5!+U-eMVViWkE2$pl zLtJD|acG|wDuv4{G0u7Z`1tp@^g4Idl3G04IeD?!>QG%kylB;@Hl=t}{~JP37YZc^ zd%`&RP%oHr^Z2p-X@hE9>GDF7|M)Z%YxRlTN}7D6R5L0z-{hEyP}WU}K6y%Cib}svsUU6pSIV=>2$ehL zA)-%3^EU7rbBqHB{W@TE=}(JP(LF6H0maJ`ZbT@4!6_*tm1 zuKtq(g(Kx7EyxEgjk*4eTOZx(Q;A4IV&Va)vN|L6NiTo&SD&_qCwJr2Amcl>>61fT zTX|o9a#x?*V?-RL=t_&aV&EqISVQ%3yukY@$)sS{{y&UwP0uk|XNs5?)4xL@t^Wga z5jGY;n@*icYQ;=CjF`Op?M2AEYFD$a{_jAM?q_^TtLX!6oi?JFa?(!=mGbp(TP|Gi z*2lK?Dc)>cWw!s6mVb2JlomRr`7_pdIjoOyqUPWMTRD9xKK~FEPNQf7fhCG6(c-lb zdws;G;Z5#v>}TqE(-4uXe;`GrRmPl`D%!Um>;WH~^=`mA|>BnOwB;>*{LZ3HnVaVVBk%uua+D{@)^Fb(Iu3 zul!QdXjZt({W|sfRIY2VGxcAi^mWBvuAH{u0?ZgDE{!w_{6a7aOw&L$0A4^V2d|)U z!sD|b@QUJBi9sl&c9KX{7k7y3#L$9=absjgvEce|zGf>E#`*%Jk;!5JrELk2w2pxI z#MBZ*zCrK|x9fi__1%H-&NW(r?Zen)ZT;z1g?v*w4R{8N@-NThC)kLG_=iWTI7C40 z;+U`G{7$e#bn~9)aXu~;hqLu%5XXKsJDsw~s{hji6ovI~)ZEMNg0r{207Y+y^zTGp z80`4>*za5X4x|m6B&(D!7fdPdiJX2;>G~Hre;8u;^v|~P4O}wQ1OZye|7;;-Lg3KZIW3<7vN$R9yZH)z_j6 zPuc=HeYsbc_hI$5Y$=;kI-*StemY6mw5u)+e-*8zd$na&>iYh(P8iWF+yANP&V0V1 z4rsyDMW*&SrRqDo3J>lEYzFkj@BtFF(Z zC;2jXkrVz&``jsFwInDqd*~IRzH`Q(ou6Y%ELKQgeskZe}%Xz zv-rI;SAKtSh(etySH7^1%jfw?%%9TuB^C*ULDNhy5k*^L8vctL2MSFc{HpHe}cpHdm+$7Fwa z9iQ^^Cj0#8o8N(@Mf20W_A|Rb($>$d$KHP6ud{&3@2|hqufktK`5S}sT|Dt8S^R{i z`f1ovSseSBCJKMt|M`H9zAf526@KLq=8ufLpodw{`S>VWd}G}Z6@iQCt_;0XT9?q(%@Hxx`*w2IPctm{b`_T3 zF!~)g@hHArsTgBD2`oqQ2~kn}vRV#A1fOqX*lGY4Mlx1gQJGv*uGZaZ5>)EsP9RBa zeArh*?rGB@PEx)UoA96Y{34`sgs8=Y1DhQ2&N}(ZbHc5& z!Li0*ca9a~)4#90=8+Oyhflos?@?1#3ZpZ*#+{!W@VW-fU8te*T371D*KYgrp2c=& z-*kIj(hLce66FyX41n>MLwD!iE3Ki=J+YpAliTXbR%CT*=#SjEB$C0L(NDg;=`Err zF}Xj_)3Z)I{&@(Nr*WXvIZFVM+uyXco&0=q@d(`BNT{tBkvX8lP;n1k^Cr7WCiEvj z9OfkD);KYh7%@-&s=MZDify}tlY6Vpw`n<(&x^-3g6L#z0NqqGW|9GqnMGz(I5#wN53Fvd^R+x#w;h_^Wr=_M{eq_ha3QxY*S!4;=6pQB2O+#Ux?kO+UUyt`+qLX< zQ?z$9d+Rj_AziHQCYR#F(>p578^a?QE4hce#5T3uIV~)%I#6?gDxNx2yp!a%!%bN9 z3w7Rj>LzmXsofurYbCwnMt8gz371TAMR1stha1pG?$P!+6Ys*tcuW+y?56_U)N~Ff&?y;?GF9xw&1de3!y8B8>pIIXkJp znxs6xpw9B1k1Y6nOw$5&2@x+>?c74IN7{Y*MpILpAC)bSY8ty1>-s|dd8@#M)TRqh?;a)wdRnM*@ zBGR?TZVIs%nn}>S38<&5OetpE}1Y+#ABY7eZ~Wr zis7MTABy$OGowBuYqy^DJg#uJcEYVlki zNhQ$1`&rSO!EmV*PBe~vF8ZQrsb`4=`L$r+n6O?TD$j36xX-svj_|Qk6_DVu$7APs z8Z!_DQP05oFs)Cz^0X+hcwBbA(n^lV?1QN~SE};Hq~B*zeN6TG(Ou3w^nM?mIw)_< z;RMYCykfHdC!L$=Y1eG_p=_RzY@CwvC&g!_L8bx1OgGS+=Ng_z+=V{{wA>Ir{1g4< z)OrG$zmM0?Sm$whh?=!pir6UDXO#ycc<>G8DK7+&2hV*9TE;1MCfcOBJ;IzP^OH5D zgQ^fEG5DIH5vMk;iHO96dPrNB2cZKcSYJ!^ol>f~<5H|I@l@&xR0JlR7}V!^dkCcB z17bal-BevWqaML7wVrJHqMR*@#&SJEK%Tg7Is;ilC_(Y;yB5RJL5ZBC^!{tu3}HV?z~ zk^TYA>Kb1*e_?xCNu(bw!%+o3z%bPxvEGLbgsJSp89}9xajIOxWu@wbP$eTYxFnTC zz+NRvP?@44R>|4CF0)cp)?^_WQe6ahrB=yQu|zGcs!LU6q1cGURIF+;KBw>oTodgV zj%-{yR)vFrJ5`OL>_UvtuBmC1#ZKl0liDCmr5cO%TFS&yMKqwauexOwN1;bSpHS+c zRI@<~SqFta;hmZ?)}m2M>e4`=evz$8$rL040O7+`-4*MvY*H=f+60yB2;nU^?}ZW~ zUJA2HizRrJtZpov8T5+D^;Vn1Vcx)IXQcf2c#zMLQiWGXhto$cj)?(Wt6z-f6$5yHm zLKXU&u$E*aS76Ikn&)wqz;ZV5tJ0Cks|1!pro_+;>bn6bMl7xPl{k$IH$zKB<|!x_ z>7q2R4AAokyJE!AFEpyRg-V61@?}a{H1U*m%35n+4xE zw!|MwQt%EdGK2-IW9!3Nt$sp4$R7i`ki6=>= zjrwxR*w`yb9UhzcqZd&cBy~BjmGg8^$;(#H)4Xb)ZzV5PZw*Hg2!0wC${b;oKm|O1 zq?ui^w_d2nN~Hp3GkvNeT2$q$i%<(VU8vD!294mZY zUGt=DC}J#|Is*pa9xCub2rp9q)=C{R2 z1#7+2a!JXK*!c1JC#KFUZJKn`a2cw!r@pJcp1z{5*KquMy40L)WPI|Y->>SUnp0=y zxoRbot4?&~O@&mSKmWqfqHG&p%&BK z(@Uvk$_rC`oHp$-BBgz?9BJ0bb;MamF#P3f8rbQ7vgYoKm#VT!AfZIqO|jh~{7AN0 zNO$&fn}+)-LhRn^&+=a@poTRyfg`NYNt~k8DHS}GB!=qOG6}IR%~#h~>U5F}|Q*Rm8Q@ zvDB|tzZJ48-Kx%YN<&+wJQOL+4UO1@-sDky9ttk8@>C)36rYa5Zxz+-{AKEkbD0fa zDr3)6@_Psee}S2>R<^dZ;@U;9Oeyds!#apU@A2Gup|f6hS+7Z4xGM$l0N0F{RzD|O z5^TMiNy}k_y2_?IXLG-uKC>RmftTE_oJ4rC#SnZ&kNzfY?Hd|^9$ zISRq#iV3o6cotx&r87QFR=NmAmRW$TgT~mHIBi{sh*GFp$^Y!@xGm=p6~N#$t~DPf z4{*IvxbcgDE&kYJrZ{XcFW5&b+Fdk+btFVAN(qI-MYR@%P@Kzl%=M3po(yeG3C1xR z(inb)AcZYo-GMk`VT++sz{j#KZHA>xSQ3O+$#zMQc~pw7W@;%D1;&t1kR-Su2oQN{ zffb!lOP_=nWi5!}sqCHhT2*V2n5T>Prxn8|TOrr}SWnH5_EB|EWqAVA5-(`i`0zj|lZP6wL6NzFP zU2UkX5|m|uWN>LAO&lVeRg^fcHHRj)wj@$piwXjKT+1w}lIm{Z6>|UT;p)J}iX35Kx0Mmo8dI+TnZ>dCEQlo$nWg;Eb*S)z9&iOL zt{=#7y!tw#{|10-CUviG$>I`9JxqpsT3)LB=2BacK1|Xf(cHF})3h+w@cJK?ZuM6T z0>w>STZ?I-sbDmZs*rOa5}n{&0PpA;TqQwAG)X1mOp z%bS%UZLurpwcz6QqoC8aat}ZnCasi9y%`eFXIfi;ZM9o1j;2Hw{8Lu{>Jr9U-K*AT zV`-@pqm`_0HVHD#gO}HOmMew{ol)9nb)~N+_;2=x zHRZA=5N}wYjui@LtPME6`O(z^F`Q-aW^c}DUumddCB2E&b^i8gmox(7l6#BS%j$fr z#q*SuWe-b^oSgq}RHh;_6?w!z5FF`WFIL&p)%uyNzIs;X5~qQ359hnLG2rVDUfrut(2(u#N{H1dLb({x>}~f zwauk6;bA4wY3GWGt}t1vY$iZiT=Pv9)>KqmeKR}P@Kgcoj|w4{=&7s>+4#7?LZREU zDkOU~xPGM49)yR%@VE6ImtiSOn)O@;l)o$!$Jc)fOJlq4YiA?XLNyVR=mG&p6HZSF zSBq51^}3gG*eZ}BZAd#F)r*h7d%zX2ZdFD=50ul zue64MeUVCjLHk7eC1XvZ#<)zXatRaLJ_c6LqlUwkRnKX$BJe;bDK;pDLji0gXywF0+cbz$e4P#UJX&a)mi zq7}eC1aU>&Uh7iFD?=9gHZ9(+md-8(h0bWtwNOvEMsytT<|+~grd-atg<6hU09@)= zI*{FpsO7p{Z(M7QzN>SGD0G!YAE10+t5e%OrMdt5Rs;S!+Bt2}ysOwRIp)Jr#{Ti! z-#HeVdue~AeWuBO{`Qiswtdaf?9DH&|LX0cjYxYzQ!b4K+G|nz^|nC#$g1`&uFmZZi!D_nH*Z z_Q2BVe;qu+uXjwYLs4Jionh;Cn|-?s7tUtMduE5N`;t!nRNfGC3$J0-c-E3HEglx1 z`)bMNV~e@r?L}m;+Pj(tBRwUB1Beftgn((zR8aI0&SAuAYqfhZ zM7@eK!MV`4*#*ZVEm@>!^e;-dxCaA|zApVglnkB5tKQ{Og{V&9NtIZv)p9NZPH7vF zwv{sn8A&3BjM#_`4QYrG>NzP-iqf<7MI{$IA% zIQ~q})^Gh~3pC6#hz>-IG)V~Y_KhtlZgP-uj)1bg#^D#p#;pg%$GjT)?VEPU9~m&h z9fI*v*l|l#;0pF53T}rFq5*>0_G0TFIM7~GN7365BUSx3qy~w$2v|fL@-U6Oa07)a zkA%b4olGgLho_fyUM>l!KrT62)J(ox@)XCFP-YF%3_a6tEn}RxE|tZe05ZdQk}XOL z(&WDQ7>JERm-N!2P`50a6pg8441>1WJQnfxCrHT=O_`io(96Mp51o0VC!m5sU0h4I z`TGHvdOc1Ewtfg@<0_`!sD2|yKO3=cV>=}XLYmk(o2xj7)wsr@MQi%)hr!V{i0(|G ztz~Gr3_=5Y$KjxsvQDfW?QDBJxcU{3DlfM06k6oWp_*SaD`&oaPi=|877DHy(*dd) zOCaFxmGRk@d(7-9Z?`ezR>|m1ut>W=$d$U=OE%(!*m8t^1}`tM$EsL#5s#}psmlBi z;YgLSn(nH854mGf&fjupF9^}r zDP+G~WPFOGw0SJJ)zS8yo$Vdo+uJ)Iw`V)^?RC35fOU^zhGsjT*ki}eu>HVc-+2*w z<~iSX#>~!Oob8}`XFXJ?hK@wqc^^t8I3M9MH$C0<02M*Wyjq=9qr62ZirLN?jg+D( z`Th2dZH6LF$)B0I-0pWKNuL=j+{GobD;igaoo(VUL6L?)hn83&y_v6)pZ<=~s=u`z zH;Jy>E)A0Yp5yX@NbwCS(6vORpohju2jr@9d<~DgS1PXo3m#T?%@s>7<-XTFr#qkm9p)pSBD;%k5i}5U!3PF;Gx(4_i+CTDje2WV$eamJ8JKQawK)Qz5F%DAExjs$xL z4rev(6l%>Z4o%h+oVbfKcX8D&RJ*9%g>`plhoOO?kwb@OyI8f04oKFW-bEK zg4*BRWzP4`?)lDbcfN2o!~=qEdAt*eDqX5KVw|c<1Q%)d9=l9y)r|8+!4?9JKgS0p$+IO zv&NnKfNf}r5EC=3?2$yk`sRWT7pz$I1}9L&lxKuL?0#o3;`nSNGAKLq_)rRE^Y@GW zxVs+eWg}vEh>qJ$1OrM{%d$;2tw0iT(V+?R@~U7hcOMl525TH6ZWVD^ywT?S-8FjZ zEm&hauGDJWFv`{A$_~21IPTm*V{?zTy$uWXptluyQXRhFp&5@$5#Q>BHd6J zAN-{-)1bnnaqnp-wEvxUv8z3f{zm(kwBy}(Z2vXw7up5wN+aIVc}^3y+P+M(zi{wR zX~$)K%vQs{+{MbhZg*{OcMm)EHg@;+c6ax7hdq*e?9|B9&Mo{}z&%Rt4uc1Bg(#FW#8OoFGVhXL<;`-45c75DFs`3ctMWs&Bb_ zt7yjEhmANw*_`e6(Wf|&7qZs96I!)%R-mwBKd>)Xlt?)4LBJ~#AquJ3M&?FXAV&$2 z3ym6x6?1*tFQZieqpQrtFmiAzqfx zkVQ75wVKGd%)}jYJtp3Zf;7<~Qb8B6#4xtYJx+za!qU_4lN6C79HJA@%Du4{>UmLg zGC?Ohm&LI12Z8;(Xp>9Mt}9}<3+1(|8XWDxr zF&rESE8i@mEE*-Pqsb zT%$8U2hD!S@jXN1{#uU5{hND1*YD$6^xo$vFQ#E^v+Ehd(fjL;Min_uQ(A*lkSbCg#Xz3Q%G zF$mQ0r8Y{$<|1BR(d~EoVQ-%8GBSkV*y8UCCf8=7FMnt0xNThthSe#E}yM3SO3f)cdx{&{rf9~38rYu z0I}SOJD}SuX?6BBy#v12((;GW&Q=~N+XGN?@?3i!PLnXUM2>c*|B zcD28TU5-xZh*Oj(r)(_FLRs>aEfDox?cX?PEco?c+<$;T{1fwa%y@7szT5A?g_Q^U z1D)<*4H`}!ID{Z%(ytv6W=0r?4m&;M#4FC*P)GPe!5*mhJLG0KyC7fgf6sw|bFMZ+ zi7UxmHV(ML9^8wVA{rQ}Q7#$#i-V2EIiN$@b;%+=A+tLk+;nhYwrojSh%8pfw=8R* zQL}Up1!VJ0N4@3lyVIyn(N#L8JGdiVhL7^y1XbNkj=ST|E$lk^T@QEfTRcLlqH-2iRBeRj#-84;~@E5VuaZe=j{o zd6^<3E}Godpbw;0uyo8W0uFJ=>FA#^7Qd^dBG$+J1rz6tT+(D(MzoQeRq`oq3UX)U z4kA!GJ#gNpRU+A(c6m+KIGkBFcT16MhSmTmslVosbOKXWOmN-HAmq;n#jFP>)mM0A zQG%8TQP2g`Tv)(-#Zj@8{<2yHXSC(PZ3IKsGQjS6!^@{Kg_a+`LOhfXy;iCPaY@U` zs`xVXQ=Q2C@n*5EMKe6XQH-akWfd2lyJZU7;)l8twA zte)R!A95_ka)P;z8j+WD@&)Cy!;_VKEuNswnY}6bIkv1vy_&Q{}GsnS^T7L#Eea(s+2U$lM+*i-~JtP#i{LpsDCK6d@iW6i4}j zraU_w630?rvDB(g4}v1CJ5*_Za6@Tak7#`{32AmH8*U4*JEe;Q?K0kKS;*T%)^;P^ zjy9D0xV|;EL!73)<<~aPE~-aF+$mJZ7jm4>=_b~GX*;rFNzLU3ebCYIkEU7|&EKhxCs`Ea8It;()p2;1lha3|@0< z+=4Ns&uM+kEvr0A!X5ws-{HCQiCwg4`<6+4SFI`1{5fN9vR}wAL4k6hh&^s+14>K+ zkB4BAxz~Y*A-`aHWN30mK^2kUFI$|{d%rm+{*=7Z#MCHu;VlvxqzOfXZD;7fOoy6g zN0sk>IkC)+F!bo-;dpf8@CZAPfX#k(go}@WeMF#+P<-?OryaeggNO|7LX7ky;=mY_ zoZd%=hewA;i^C1JzOG6xAdd)JWXq0QRJS->gT_e}bDGGmUWcW-WOyAphv8JY3eOq6 zI=oZ5m=op4LN^}GOA5ZETN=wEWojxZPR~9dSF)8c1P%^H_dRLqUE?6e7DP?Y&|iWe!DWp+8*4 zzIf{@d6tp$^550bX{PxYa833(UH-VS@3kp--E^q9Yz)m08I7}#aK~`?1(G^tC3m7^ z+rMVz!x40!XoKg076Z$SLYau?&BRg1IqdxG@N0&@<^e?p7#NW3cd_{Cag+Csbug#OZ`wr|Q&Pgs=i~gKOE*?Dzxi>}aIT zj-95V$j1$9U3($bIp5{%5QF*YD^JYH8)NE;)U zRp@g-=cuPE#^v#baxy|sCPtf3^{822|5d0m-*7Sjb(txEn;s9~m~1cDK_zZdWuj51 zY70Yue5XWaM1{>48p9cl$YjNF?9tD~R|dJ&rxJeGEKqn1>6@Pxikt=uDojx)YNpVAv8qlj876kULdfe z6{NE3B6bbBFiC_Tx)ru|T1@#bh-fwhbF?aM8L|EGA2S(!0u3G0iML)Mi#_2rag9mw z7#ZGEl9m69aUPgO$e$8G>J5Q+^i6FW4ltZ~{o-Ck&KNVdjE({}P-9nVfKkN<}4 zKR^ES@jqezJMG6~z@GdU$N!A&#W9{cIX*c)hH!QQBSYf}fnacXe3R`-=kEA~tf7r3 z>!H4qjUJ?u%Q~EpyKHgb$sz(ujI&bRkoZBkWGv=c$ek|vw;i9RgoNQIXUFjN$NkA| zXME3_{Pl<-#%QF^OlcE=a2*f&g4nv*%@I5U@Q8s0P*tLstOv`at!#`A28WaLu<1G8 z%8rxtm6Tm!f$pY&m9JCCO(p8&$!p#5Lx*@x?~CI*(*cZYja{(I=JE>INkkS@ZS9Wl zuEZc7AwuJAutgA13~>EBxsw?;!^s+&mnRR{HU^*+KOLY9C*K8ILp8AsvEc{VG96mG zromeHxTKj9c)3%{NvAtbP%i{d`J%-EDn{9)52|Azea|khHX-={C(|cL6mh*p*`GYj zLB_&mR5qGu)rmvZR}Is=Fd>P*4vZ&Q>PVhe;>ls&jmPF?-VOOOe$&3mgNDd+qpTWE z{6uO(!Kxj-f@DTK zpO$3OJ<$T;NoP?6g~HEhU&2Thhi&rsb$lzu0EM8*Q+<$J z!rd!QR!?}*@)?fS5@0&KxE_iV)jl3yO#ZyGb8>tRmD)tMV1AV+S8Y&xg=~|ElK|Dw zmJ7~;>Z@0_7!!NX5hOCfexP5+`dDv~3S~>qs^d=(wbam8zn$!!%ub;@{h5aQPft!6 zXJmGYNvH2lzGTc}u$>Z<(_`9iH1Os4;|T&!Pfj3^-6>fyDJ+URKN%uYF|yelf8X|s z#Wy*|xtafwz4UlEGI7Z%CT8p-V6i0X9g|nu&uvWI9*aXg@3@*s9hm&hVKQA}#OQds zc5)gzViG>bIFDk3oXV;(_YbggdY_ywV)X_CzM75>gE=o~H%?>wh)u2Q%y@cF>aY|6 zcuvu?t|Qr({u?K8Mf~fierpF@h#F*^j;4#i_{!+SygYdn6)2kCPI0ZG4InjIal~n~ z7zB;HB{F9wU))rTF6dz0XsFdcMudDNCPrgHxNo^XA!KDzO!>yD5kqvEZ&H(8$(e#N zp2AT>B_N(X%}{ePSF?ac!n~X-eAxKY-)s(SM{hUS;WzA@F@(3mU#@6U6D1>Lo^X9X zWmkUd@LP9!Q?rJ+F!r~8rN?mkK6A%p3gpz-PI^oK&gbkT6w0;@TOzr~RwlV81hM0IsMHcP_KMy{Sn z0lZ-xPwo`R@W*X@kP3W0NJ935@ak=tg`^9$P-#msWSGR(D3uVsEf)Ud5(>?ySOY*79wET@$@o2f4lxQ%c@=H|B;VccJ5$%uP zSboNAWh74Vk~YI3jk^TO>+nxBgZTe2@~*MAW!Zh#-upc7xwmdrb-QgW0ysDz5HAG< zqFs};0ki%3@o8Kq`;YfwyZ`qYc!tgOeqmP4{%|0@CO1u>c0} z30WhcR<1b&M}k;KBmxI`x#>0R&K^^?{oiFpJFz%8L5k87Yx(#4uJVo{s`K4gf4sl{xMNjJ*E#*{ZN*-M96u%-cbolffkF$>+rU#&#Ey)T zd&YB(Ld2eP-X^-5#LeSpo$@I+XU*gE7`(gi6oFHcVKD(_v`-_(J>+Ih%uJxs6yz{z z9ygEg-9<35u!8vRI&@Mi^kmTnv^C?U930G0^$cw&RkTuS;xjL^eME99-Kgb$Sd^T3 zt*oV(KOU=hD2ab9!$AqX4LV^Z^P$&;<|yf*Wnp2My^@=^l@)qi?>`e@#Wd^%os$(` zoiJAd>Ht0un@(8b`!===V={GV88dW9I;9KP#kV zj<*>^*o>fcbgePkvXW|B+<(7rK%jH&4@9yiQCx})ADK)PRBfKo)Xi43J76? zVlGZ2T6VW_pk-RQ*%pmcg{H6iC+7$Q&$wx&RDy&K zmw9vdfZ=Wyet!`TqsONaspMejM2L1d^R$3&s`0AlGGlhr6~R z*G)WRBZ{t3vo9Y(zZFkH^|Y#~yMD@5&@)!A_OJFg4)zZYP=c|2u#fZp0r3uiz%64XdUEd~r%c}!@kOEI)?Qme9PGDjSQ-T4&3?eD%ZB3h z$#e*wPkimM!uo!5FjmDDvvE3$!e%vK2=`P5Nzhci-v5l@@)P$E!p+3xm3hE-o3d&c z#vLoUS`%QqI9muUH#Nc^B7G#od|l_RB$AqoHl$ETa?Spau35lp%`B5r)qBI5YABP7 z4Uu<(8<%$fnKg!M{&nqTLKwgPd!!&eOKs-^~CxN!N4r zFaZb_@$iBwL4(Q@xkl33n$aRuv7CxnF=|$I>kjUNRJfR5R=x4e9)vX+5hN+@A!q9b+zRsHza(Cj zOloX~RLnHw++Q(UMSvCiW|AWnQ5kJ(dF2U>%hD@_Mlv(^zJRIK z9bFF&4-dM-X}C3UrA};2hXA0&AG${bnPjA3;NylkBcif$2yn-=JDdehU6Ajb$H~up zmjz3{3kI*j!-FLg16&;JmITs)!iG`s1K)HiB_XCMn$+#UdUU7)f|zMr7|SuW*o@Rw zg%@7rw>-En`}h>mMC338i>ME;K_BXay@6TeD{O*rL_{zO{ZJ2vGNrM1QYm_Y-Fh%c|t6sQC&*TVxE^pKYZBj8!@(4j%BBxqRowj?8V z8;`LKVs}V&6u-^x&?v=I%$9w={X_ZQx_Z!cvJ^PlBD_r_(e`jBQXvjUfhElDxxybG zL3U!sr3!%EVGsF?sfkrhy#C-*xDNgW1)IHGjC4%Z7B3>{yj?6a>j`Gj3E8i`N96(X@;v;0|t} zB@_)-B5IRqsq-2Id}=7Cl)uoy)X-MR6~0%vS78dCSzly{-LDRx3WyTxFtX|*tF~Ox zC4!hQ$2=igPkdUR6QXA??X!^m!8G&)mWY86j@`j^SV}PU8~o<6-a&}pXdr4Q)^)yG zr0ue~kXuGy@i2@9o7;vXj(#Sd?>lj{^Ymn;jhU;pN=UwrEh#NyM0P7Mvh`LOP*nxX zW+BqSj1{Rb27P@HM#6H6gZqSRI`hbH?TFYN{uvCv7aY!*{W{~@jLXAAuK(@f_qZM~ zeEO|JcYf*cuW-ft@aPDrqr<}^C>?bvFMMc%$K>v**Zd?qp|)I zjAytZFZQFO#o_qqushm36yAlz-1HFup9LDhfHnTyp9hRPdK@Jor>ny)9S@H#oj8?d zl{_+B50XpGI;zhc8aPId1~_MMN>~~NTTSL+BLAe=!(C$ZML=p}2s3lt`>?lQ?mm5i ze|5MM=|NAUj6FIk)H(Ga?@B+csBPeiokAp5x+&}sSzbnp3LSB4*@~RBwK|s4#Ce0N zdOBuxgce{}qauWVN*2RM<`zL$idh;V@!C7g9-RJ&7a~}O>W_8`%3;k?gJYKWiN;We zR#FWa1m$2ZTj_191Rp*4YM>USyo$mhj142zhYx~aSmThrn@%#~g~NWqPUFba9Klti z6d;VZq07~~FM$le|jiQM6bfn^A@`1_LKuJlr%YIwL9a!a2F_}yxyt$}TOT`+PCdFvZ z$kQVhHQ*;&u;(WvX3xqmKZ6`9m^$#&O%DE%N^MRCp@L0-R7DxBQzylgLVI(OC!FNrGz)Gu8iDcb4wqqCDqP}Q7IaEhZQ)>2i7V?N#UU4AoO^GFz9exK zt5r94Z?kU}`TppS?nUNYI2ah7GfY$PftO7&PhsXsx@ac9F3V~68A6OGCD%MX%Tibo z9ogua$h53ob05;sraOvWRb!WnhRG)%JyrRN8zeEhf)8TpIAh32(N=M{)y=G5@40V) zWS;gntjTjxY@-=L$XAJB;Pg#_`e7@hoqk9z*Mx{bT0{a!hK+(B!Uzxpp}{eNAESQ^!5t?Iw2M801O)ZL|A=>x7zSLi6@^0j#9lC}pAf5QJlJ%r^u(CLit^3f_cKdvq^F6_PLL zV^Fo=1(QK|>W;UI%~CO<1{e&nGBr!!8gP=+%&d#*PBJ}SAsVpR`EY^(E!y@$IV+RnRIeIvd5BZXyitl88YXn?VAN+-vmzAHvx zVAW#b7G~Cb&OP5v4bb6JdU_S6c@7=~Ut`M5m&(yf;f{|gyyD%dl=ni@Aio5?Io=JL z3hhaFP?!b?e$jDZeKbq;x{@e7R*`AMD62;cFe@?B2i{leFB|nQw#E%k?&wlV>?BfG zfo$8MeQo8`&dOCK4>HZRS^?6Qqdt(9gMx=*r5+Fp?TtjiBI_&||JWFaBxIIe7J_8I zc;fT@N=vZjUcjIQzauj#<4Vy`#__v=PZ#34X;_~#N4q`gn}V%Qh^SwcFGmftY2t;X zv%oTNxFx&cq#2-tOY#oQZK-?7!uVA*wR+093V&liW$Z9B2H-<#28+^N6k zhka&}#qW-M!5TmH86BObv;8(C9j)nWdvtVNkY<6BogIP*C(KR2C6~*Ru)#f%5liH%UTRwRUiLN4DAX5rwmn^$IDX9tQl=>8mg2K8bmGzyJ4J{ zt;=H#9dpJlBk71UI{GH#>iC4~CF45`71H7djMee?xf;Myc$d{TLj39RdH&EjKKfl2 zkB=9}{Rwgy zE*RbM4~{pm0b2Mp&`=|?3Op!H5pxsx+<@{I7VNMmvA6{TZe8xC-U zmxj-j%b=WRZ^tK8gDYxc)v+vXZE2{qGvCZWP1@t_^drccJ*|2&7SsKh8i_AoSA{iq ziFr@r1~o}uN-=^4RNLcC@dIla)E03a><1)$o%6N?36J`CCx{i_!7dUCG~;r{NVP}q zI#8FH1O0?a51}4C3SbIj9Oa~e@h0Pw<3U|DQxXm~TM~?-o3kp=;M^78`L3S)ouI~c z5SFrz9lH_Iq>FgtljHj2VR#fzEWe7`KuwC@u&VaP?pc=rGz~kpB>b(>hYlx zJ+>)ZxLf~(sE;M7A#V|YQUvd%L%8>>o3$m}&{|=XFtQD2mCzkC=ub$WU#X&Is}zbS zK$x6hc@Rn?7Bd57fz(vi(QN$*UwOmSyz9^r_-wTZr1hZ5T+zCddvfIyG*mxprB!L! zJlYx5#R%9OH<{+JULWs?!N;)@ydqYAvRiV`x5J#3QIxBs7-h+FM%|!8)sf-pN@qm z_I$SDJ7oi7;mV=sd;1BxJVj-OHt(|e!_x%rj>gbSTNx=&O)IM4$g0~E*Z$zitO>~zXW_LOGnXX0j{9UO$gX^PREZGg9XmMZBsf&l@nGzyyVP^G*E{hX! zht|f1_<5*gVP9vV^Hmbg@EXo#(V{d(^l_SdJo3<#W0`NkJXfKC@V=KUB(GC*=ilt9 zZJV8JTB@N%Q`niDYVAdUxZve}X^zZauo5OurZLua<2@ak30~uv;qMh8+02;j$zBS` z$}vX6i>Cryjh=Bm{*?NKxsL=cs25bqm)u* zT7a`Vhe|~^vTZ)m4^d;w5#KOe8}^b?>2WAVV&t@LiTEy!P)}r>sZ`;;h#C#89N+v; zG>{!qTM3EQPrUN|svD}}y(Wd>RlW?!q?RvpUr}i#wJ1a|%+4mgDjGGy*o4>&ItWv- zv|_AZP0@hKod3MHE`=|O;CgbrDDQA+>YbYTJD?l-N@4AUDWid3zV)MgcDf=AhY!NT z;W5*kFEM~+J2X;olBEXAJd#dl*_$UPH#{gpqKEl)EXhO6z0w?tt?;*HH(p@j<^f(2 zaCCCZe*Q8rSb_?yCsmLQS4vmpKOZ+&>c69wV`ryb`w-!U1$Q6HPVi3-5+-YDTd^DF-f;Sz;e5_d&BXK#QteWP4F;1qLc|ywE zTwU|7>4kZNAHrqFS520yM(Z0lDZ(lSLfO_k_RDyw_Sbd;@KlSCHi?IJI%0tGgp$XZmRdO8B<< z&4L3P#t+It&tssF<>Wo_R9aaqU50OoEJJVYPC3hmK9SBUU)Gvy?mW!Kj#}V zPWI3-!-22E)K~RZB8PCpOEk}EAN`d_yopL>O4)avoD6Pk{xVoubA@&5m1lMMo-num zbT9YADCMxsftKJd<}0Jnt67k<8|hKXZN|MX5xp_EU+Ba__DnQpI$B!(?ZjsKW$nvL z(6SIt0J{T$150N7`Ba=?;<4brnlUm)v>RRUba5IyFe&Zeh6qK8$VV;m1PCvsA9@Y9 zQ5-_&OUbU#!&7fME1rDk{!sG;0T=TxQh{$#OV=fCK?4f~?fo+2&r9ke5iN&whl2AT zMX{EQ0;szk7v0Ul-Vhvp)8_hIptVoQELm)o?K-=oDT0mYpn#M)A&h{ z_5;3Zp+(jz`yxBl5J@2eSH7{0=5+>S)Y*l4Z6``1*@^?*Jhh2!?|CYcQ=W?ae#q9& zCU@69@xB!2R1Al2V)b;VltpFAmx;k<`v;6#{0?NKvHMnFL+hcTh7KN*$PVV`XJnzn3Eb~8H6vh1B%62eP zwyaWeTx&QKDPhN4pB^dm?ZpguWq7S2$uJKZh2E@|DlEN&`Wf{L0$ zXIho*K1yQZA=7EgTGHmb|I8|5x{&r+_!KC)S{(7)(;c?dBBv=z1`^(&qPQYGD{g1p z#_BQ?a$|6j**ro5no1eVigPHFXw<9<1lJS^H?F3VcVk8}anDtL;+0*WkuCntP-?rR zAUl=gWS>n)TD-m73*-81H|{Q}3V%XA*$kQTU1_ud$zo=TYF6s(0eLpWQ{WIeZS9Ft z^zh3b$-a!Zo|Y`|a1^3qZ7`NKEnp{X$Waqz?MnlOaPIP(IOw&eRd`4;3k%6JrVVDQ zX}9uE7oL)h?W5tKxw=I^_Gf%;57RDl<>!WI*`Vt-QfvWASJQIc**zKaK?r^;5>4J& zO^KD1vZ-1(e06APy<{6HCo$XQt~O_+uwlEdoEOc{?KUFWxJ{=2B z?D;I2$h~0MAQ9G=L1YppN@Wh8!e|&Bmu!MIo4y`iCs2xl z0;5!pet?r(U6zLJwlpS?cdsOVOG@Bwr6BRj3Sv@_RUS)^WOMc~GAS3V%zS7qkS0&hR&$mUs5r*b4=sHW!5s^q?MHJ6fzDE^C1)|4?p2>3XD;k9C zz<9Gn{CSjeC|ZyNQjfdl@=0ddWq^y#k za+WqI1&Qrx_(n-qMO?Wo!)pV$VwXNhGC=fvSD^d^m{!0N`7x!vom+jLoWS~8P^O~ zPZ?@3J)^DMJYw83evRRC<01CI%o)bJ%3_n4Pux(~1$*wyxZETnEQaRA@7_Q+wLwG;dHtWmNKNxG znDN`@{LI+=ATfQ;vNWu0Y;|miS`x8S(z^#R>&^GS0bN#&+%)eY zrp|kWVHDCdx(mFkVnL7gd^d4oMPo1oHX+`|aE#WnddZ1H%QlWwn2F2UJ>^plZ_zt! zH#XxPtNwh0C!8X#Q$Dhg7eCj<-7ZMEGz1-vnr1RrpG|u@Hx~!X0Y1VuwfQs3iM*;L$42@WTGhFxsEW1q4yS-dg z(kx5lMjDmYt)enPhhLt9SVc~IFq6(b&O_mC*F^(L+`4PX@1t@+O{P8DGj66D;nyurZ?PO1f^a#8FRoA#GEN;9q@KMP)x7`z}c_HlFuSr$Vbt>c>9rU!$%A|^u)lC?flXCe-^91&h?yeS?*?kb^a}`zr}#l1uGXI#GS%j5a)tlG_0Ty zI~y10=dpRsX6@#Ab3t-t?T4LdiHjve&{evkoCt>Cl@WJ3oDeMXq2SC{=Z2o1KPang z@#orBSOphBQ5SGsuFki@IIK)$8r!@{E*A0BUyKEoh{Q*+90@=lP8YFgCVct$2pg~q z-}-#JaG^8-kwO_d2^g;m&yvXK;+CcJbA=jGl?uHZv7H;PFKL1l8gyaJ*$W0r)n814 z%ZTL2Qff^swdYT#S9-F6#l3iNe%@Vd2-*>2d~x1J`WzdK)@8IjRr&;S&{H*O-b+ei zHRqcm;ySQ^tQuTp&a%pI7yPyiZ}hfjYRju@IAk*n9cB=IIRr8x_O!`Cpg{n>`NX#T zKziE@E5d2(00kgIZ#Ys!$$>uPK9Qi`Waj20DczCJ=@QEe!u}IZAfdKc6XrSsvkIv(e zD|wps(nPz9?96rP`AQ51{Jx1hUz3qCzjXj?F78L{z&CY%Br@6z-~uuP0ZgNrx{GZ+ zSfzd$wkv68aZRF*Q1oCzb~bIq7sR;gV~3=1s#Mg2Kua+9?fwQZPl77uOMuCPAW#a< zb0*p1nC#8K6F>w{I1mcUmjm~#xLgNPHNhP2NUn5aQMh?hf;d*KE7?do$+8Vq*X^1m z_kevSv`VJo5|R<5A|utHT<43(E)QJ*FA6u|X~v{?S4W9grUZhT;FA(tzvf~$mRx=k z*ua=cZRpDKl5mNC5i@L!Szu(lsHPYVwYV2gQ&4hQMmVP^q2j`E}Lv{q3d|=!$wD`2)n}GJ2IGy5#+iE^N=Hh_CaPV zumTJRF_I|XNd&kQH zN}H9~+I|XmGtFB}agtLOxy$?>JYjSJjUPrgilaz#(GoMNvl{+5Y27X=%`C*^Q$8q5JE>Pr`xY+td zbh66>X!21iCBycK`ehkB+D6V)N<>ndUUrw;dh@Zp*YD|}JIzn$?(!*Z!Zaq*TIM-< zGL<9C-(NlxhNb4ArUzV~I(;H+Y$yWF8FTpYyIU$M{99bV$@q3y9K_Z7jxNp^j~U;+ z{65zOW6JpDOKq+hHAD5abGX)A>XFg(%yD`78_ed68N;|M=ufULud2)O)n#`zzPwsq z_TCVl>F5fGD-OZc8Fbb zyhlh#z@D|x0imvLia&xCl6g0pOcK|*tSJYhq`4?d{nZRSu>~oa=(k9g_>p34^=LoB zJhbB!21Wg1q1<2y*9@F#s$YM#75QKsCJm_uw=`X z?n#L@1m}$tQJ8jD2H>b-%)9AoFM`Jf=OzN#4ZJPGlD5j0>EkhTRx3Ly{PkC^sX3WlHEO)Cr9U(tBDv<&0>xtrBkm|aL<-bwKaE-Ia;if`Rg zW|lpN$k9Q^;ggBfFmjcSwgn zE7wyotEO8&yg%wIEyAc(h^r>|^oceCr@y?-43<~B2^Z2MpL=Fwa|9RW*FLkN*dHx@mhXtQ9E9kT`_!v*US60DASR_Igu6#@y8tus{U zCKC542mcVVBI%VzpB^4#v0UU~Wh|@BeD(bZ8kA0$TI#b{Qneh@t3zhjjB~~j<98Up z%_wF39#h-K?HPk!DJwVJg%Q&EevBp8TgLy(aDI{c3UPB4?F2EkQXN%s=XbA0*K-CL zFxqR5)b&;T(b24IU0?Z_+dbPX@OOyZBt+UTtc61<|misd%P( zuJX6SR+Lq&8^9;;7Yw+?{PJo;>(MnCVZehJGK*raWCTs;gztNt~jdfrsQwtQ{n!oT2=T z`=&xg&c=X4Jd0x_$A!AZs@2M!Oq4e%3GZcsCJN5e#g+%1u3^xlV1G@flBx08aIeF4 zt?5r{n)ZR?lg`7(`_)!lK~Y{lv^)WGsCy`!FrDEzq+t`0n;_C&jjvg?StJpR?)st` zT8#H`sbqh>lZe_5I+zmQSB(04!nS~ICfG%o;&UCknzb||UG)%K))bHy^(s$W1qB=? zwl0>z$lR@=8%!+ndzeC`AJW ztdy`yuA*KOaxd;&2viSeqtUod#n`E@9~3fatOUV_L3&kE?Eu&Z? zyoqCs_~_AH|A;H)FTzXVstWy-j0Xc%QKVGea@DLg09ZhiBchSS)F`oyTw}&hZSbtH zF44Q1M=vIPS<5II-V|dU7T3GMkW0k!MK!yACWy=2P45|?yjns6nO0aQwG<>N6zN8> ztw|LuvtsS_!vRxZA~cbHbn3PFn0~z3j2Y)($U|BBtEpXrUo=xugTr!-UgVOLL%UV@ zk7$wpTR{sz~-c>OC}j~KsoJ-)vA7L)&p z(O&;5S8}}h>(~GHb$@eyJ-#uCn|s$c*L?WHW^~hCZ^lF1S!;Zby>8gM?rs)XA|W3A z&0Yco0z$Ah0b$7wO5xkw%mX()7T4Pm?;5o9N5!zFfo>q&TtAeHG36DZb?tEwxFtNV z08RDa4b55R6 z*;4MOi{s#hNh@7_T+6a>?=T^U-rl&sh!r}GRbj%>shf1j?S_8H7a_>; z_9{H8n{6T4)0e!%e^u;mSsUNnt_+0H5O&0q$o(xfVs$H61rI&z#Kglmri9Ai%K1F5 zyohdZS`hAqC;MhIx}D!3RCsWpZu{bG3Zlp^GP`9en4(PJHSnA9EGx5S-)A`-gLLmhM-Bl5TUH$Dy$r~!$fwW6HjgID=CMAu`43$)~UPYy^CMN-FbVP z%m;5P*N4qLozhVqf>x_49gs?3F+!yNrm_YSqlU)UV8wka{eQ&h1uUjqH0xAXYVOg! z-a>doL?kh@rhJ72>`rlDd6_K}`$Oyw9P{c*Y#!U&%?RHnyQI%IW2oeoy4a_3uxMG? z{`P(n%Yf0!Oob=eJJ>96ce5jqXr0F(AAlM~Exivtj)D5f(T?WVi^ky^HrZ6k+Ca|) zR`84nw>LF8>E0NWKR(Knxzudf8@3tx>k?bcx?+;ve4pGYVtLaM>o|$+%>vZWCAy`8 z$}F~SrqLiuXoHEiV$@}1YZ)41_F7=Kw|lu#mZQL$E@g||T5a9L3!N7cVsvvRbyCoy zicLL3y8sOK`b0~UL*UPNth4;kOx0bRmU&fTN81|HTw0G*fL5u`lEn&-;mjBWwwVss z&>>%ROVXX)KAl_g4J*7mQZmoFT;7)|B+`Gxi3XAbR-SJ^XV{05m-ZiArgO%E zLG>Au5@Hv2t6UDgX5LHr$4-vs-F9{W=Eo0J@FqWrX`C ztG~%G%r#?ii(*scjNr~iaTmcLGMfG_h0~;EgWw#>B5Z0!EMX6TL^Z6 zLyyIsE|}i7*!3~Sx2$&44gJk7!}U|n69Wu4wCHa)1F)U$-cDoLfQdfM zw!OU&F!z>(aBe7oshL35Lrc-olhc8Sxl z9D?)xE~wfEwqy;rB+Y8NBaSXDEQYaUUWevc$|?aYykv_&(FiF(Ybd>zQ=67gX&GP? zOb%IelWusf7(-coHaEi;+HFuwC&>y?2mgrfqb#E5C3QcND5=zC*G4g3ib_b^B*W5s z!MB-igYKV@vq7`|7VU*}D?XXSW|-FD#1sy>;%;&ZJ+*>b=9scB?s#-ldMc131k-L% zO$E9x+eid)(m)(zVu4~EccnW~a^gmCw-5%z#_$f&1( zmFxdA{gYf*jOp~h;(9S%aFyQQXZ$APVEQet-4lhORRi1IqD%###gl zuK;JIG&FFQprCO;+?BT622NGsIE{2?Q(^hmnQbNTYPOxyury)T&G_;nc3^deh|oE6 zz6cdE(_&;X*MKI~15zqCV?yU*(am;D#KvhOxn^3&)`p9nJlrO|u#7o8eoE82%m9tWz9I(p#6q{U&vk(fU+j<0)N7 zg_7OoUrR%oq|@;U6&Uq3?0GB?R!UD&L6G9Wkp0if$!{(6@{^XU7@10(VXJUISF%GX+E3H`J2TW_S{G8jphWOuVx)1 z*T`tTV9aNm;WM7iT@tFAZ70UOnN64x3^(C>Y{qj?E?KH)TWKbwqY5&s@G;yx?0Yap zp)gozrEA`eh#Ij60oo^mP&*u?($DS%yOPpgdGNMin>wyBi4H&{6KgcMW@vv(lc~18_g+wFjJOR4Z@2o(j*h3-RGfIks4q#;)J;@vWhoF)sg{5fGONoGSRA; z^A?zI=K{|?&n+2~0@fX~fkKC^DX_>Jvq+=?dVm@i_QIr}Z^l9wn`L{p%)q>u@XBg9 zGo(0K0mIW!;>@}27?D{-O>34iqQ&HUVJ;y7%ro;zu;`3=k)lB%4O{M6*t`B37*x>% z6Y#sjPfqk&Vs|K7bT6WS7MUd98PT&}Y|(a}K!Vqd6{b{KK9Yq)cz4CDwFu^lVbsU% zP%+H<6l7Jb8xZ0Q@a5edfEUB32H10=JVYW#5RyqbkUs;-*p&2d4Q9IE!?48 z#3vny!Sxad?PszoNm>wB`9_V^WwBkcQbT~;Y!;0w#sc>n?!ufgvX-OS_hK#c*S2K{ z;r$r9RqCPn6=TZi<_`e&FGI{tPKx!=@Yz4nSyn{c>u?;+F7EIQBkp{@;2QZyt#Z|! z$BZL}^UTut%XySMR;AevbzJgb9OKSM%{=-eD3?D6kmMiOS+AqH)qRgIhq$$3f88 zmg^FKoa9EAmY8H5hMXs6CFYDNEdsd$YaZwce8i>7;p8%9!_6%tI5Xk%G9-#-3uG=_ z=-^OF8g+@W6=a4SgJZ<0lW{eFCUlBRsHYT|@#bCdnq6>CV{EG?pLX$#GV?)_GU*oV z#zKqrvoT}Wzm%ejlu8K~q>DtcV~mEO`rTqTe7tn?y>L#1j%)@dlsPkk39s|TUic)R zI+TLES_-NlZDja_RlvL7E;a*;Zv>NeVZwr3a+|khwt`6YVk7f++N&j3hk-rN zN8Bb+rBK^I0%yD?N@Ebh1y|mxqMLW4mRbi3`Iy4fvBIU?vFAl9xn{kGsr!R?S%7TY z7TBn1B-)3#Y0JBoKo8PYa6U-SH7>-d=bv8h27%nkt_U3f$d+Hgv|nt60gEdv~UBtzzG2L)kQ| z_4;g~XPcG1VY-SErD+0>=CjBM4H79ahRsTc*t02`5Wtppo*lRuq9vnjS&N(~OYA6# zC5Xx(o!Ln=8bU#+TdFimn%|Di;n+k^UYAhWwVa5QD8%V`N&&4HWMXv?qMMs_U$Rch z{8U?vmNUi~gF~`hES5{8tuNULxqScKySq4x6p&27PGgLCU^B!R>*fonCVMOO0 zmT}dKw@R8=ZzMBV7q&s9V{;|QDyr@4ZvOD)q6K_vF7lhU?3J$ z`Hqb#-7e&I{+WOdI)PmtCESw1P)|+y@=^&v6w>Ts8fm-F4~Hdf#}!|m6*O&&Ckv5v zbR+Qg4{yQc7KZFJ%WZEAPN;YHIqz|ArJ_6V4|1YcSYeDJ7+Pia?O(nTVp}p%Tb`U1 z6C&Z7A8i)uS@%_>^ro&d{I*LN;`sKL! z@~{9NDc>zjC1ATm|4Cdf37f?l7|zS87I(cKCp!ojX1@I1akeqnjK9IdciQ7oQG zA)bDDxw&L%1@#!e!~O3u@LheMp~u%5w@YVQA!c|_%d@!W3{qzATU>7$N6YaNkb6L5 z?FZJ_^u=zpS_BWh7O|suGTRLgS|AZkcbmW-uy? z^Ht37Y{Ms+jsWaed%;bF zV#^iZ#wn4Z`0k3qTTP&RP=(d9Nzt0sy#)5!V62$^>gll2&Obh#*{nizUIG!7?{e&8 zgBfMXMkqEEq**;vutkXv=7!*v97K7=W@?0B10B+`jc9f`e|~CM-Sw|gLy?S`3AG4o z7jx@ZPlYEj(?95`lmQ*v?z7t@?`(22>{h$6p(pR6V9K{(u(b_v%8ctMZ(~of%C|#M zO?0ELQ3i+1{Jt28vl=SE>j(RERs1`3W&p?eih2~kK-PMxz5`l`XOt=scv19`z$zZm zD{Yg$`ddDunWe_g=c|3Lf0c2t`VQA$SY31dUl7|rT_EW5>D%feVF$8t4cEoZLuY`S7Nq-55v z6V!@UOJaSssUK+Q$}*;_j>!FBqIIWr#i}G6@fb8is3E1Ecv^RWgbA{eaA{*O}z)1Af$&h z+%arsW=rse!L!r`T7B5HL9NuHMx2P<=Iucch)#v3xh0hrQY*Pjx=k5F)`}?h0I%0D z)*&k$v^o=khE$|vI^Ak7$|96cP0@sDB6FjkRY4~Kc>m#Ch?+(Qt4gJ#9l=6UK@C_{ zyE$c9>bl%x+eL0lRv_DmVh?B|2k!$^fLY5tn#yY)apI!yL0>+B9{8Cxub{Bxs1Wk5 z6pIpj#=VI-zp%Kw?(=CmT$d4RAauiyR?EP&J(4Kjv(YS>qWjXP&n;iMwb;m_iqZ!= zW_{o_;e8pXVkL(rU2l18*Gg8a>v+y?>njs5oI}U#LyMgtm)t9cJ!oPVj1)doNqb7& zt>$bE`Ok+ws~|JgyxYQiCd1y{&%rSEE*Ex@!C z^q|^IMCKWPRG$}5U~72paEq{uYFq`Y#~4$Q8l4H(*D^8e6@ydB)$Fu#m4XK$voVyBF17#xOxK!oxh1`an&LWi{qhGikBpTwp>DWYIF~OBNlO?uJ}mGV@_C^-+Av z<#tmwm=tBm>09GC)T8C?2hcb%XRQI^%Ck*>~qF2VMg9^q`%<#|3 zJQW@ox@C-^EQvXAGxGhxRLhoyzJ@T8NTLfN2N(t94eCDcTOK%c%(@`0igsx6sCXKw1NC-;tB&?U2$Fia%%-c-RW*Jz)XxZ1{=A7~y}IbEtz1%> z>lC?V{cecDR}kChfjFw{$KHb)@kD82fJtoE-I+#=3d`K(H;}?5`z#kLM%u=~4P$ov zF9M_LCe}yQZPYF4lG0W{gQvzLz8#|@L+Vb^Bxx{#>RQ^JBrwl(Y?0vZdAj4z_l=AN z42$Lobp%SlWf+8QpaQhXW)%^ijFY>oI)vrLIRMv8lg+@>9<)S0=N``y5cVPa!WjI` z24+tv$PXZO^N;&466Sa6NA;iQ{%uB6|EFA)>F+T9Qhm$yn4uECqc#m`($XDc)L_@l z>kZ~HZRTCqH1=_;1THS3%1@qeO|a6$`*42`?a9%zvt))uT$rUoj_ zs(5okHR$Rs4ER*_m@@NxKm5F~O5bv&63p)9hUOWr55PIR>H#d76fC$_;mB1x^H*%UUVic=M?hOxgqHOvFBX||JaSlEQ5@^p~pQtsGGNq^pxE_Tf> zR}D-vQrFcqmjY)mW&@Z{;;ETEWN|u_$ey(z?o8t< zhfpelS?a2Z_-FW?ZNAR+ zSDWA9dc!ztHk-C-`JbZ2+r%0Z?_4{kBbsyD)!69xpB8%lUl?q~N`z~g3C2j(ZUqp( znDiM7N>>SllQxo#l?d0jya!r3C?GkqK=%9tTuala!GYE5I|Q3wRuzXWy@n`%6lZtsA4eS zt4b8kQ9EuBSbpI^C$bUZv7Z}BthmrQ1dnV@NpZZl<|=XX%UC*V-8DOIm`ZxMq?aRQ z?b;0uEUdgjTn=Zu$KWxLm8{jyyi~B4u|=^&geZSTXR4N3J>@iqx9Fw7i%zhLNhjOQ z5W9(l5pT?*Ru~6x1Rg}p#IRh21TM?X{>j9+@?>&BD1}L46BbQEC(Rawi=vp&5Q^Rv zp=%xl=gg$#J#N+As#|edt7s`6rhVDW0II+jN(t4|h5wK^PyVf+6*(%~f zvm1uFk}zxIY==7hQ;;rS42H;3&}@-fW+yYgn>mkFP>IHqmCKIl-EtKO3SGGG%a!&b;WjeA3xrhyIGeZWT>iixqQPtr4%Dw z`aoT__od^9oxoW88?|oNrFLECI2z${m#VRw;T3Bn4NC_lh14q(Gda=Pa!5P!$;tlRq%|17!Ntgd$IkA@zdi! zjtW0D*%>{Uyf*r!$v-td9Q|PYU&Hycnj6XN}?k#XqphEN^yudvF>#|jG>^7p_0i8QV>xY`M?Fu= zM;n;`+zr!HhQJyL=$iLAtSNw1Qk-i}q#;8Fd_ z=;Q8_osU1^@8eHC=|0}^&g|nhc6Q6o#~;_9^dIjIn;7ot5`Wrm#;HXZVI?(d0*J`Vm$04g%`bGh%0` z$EqN8+?StJm}Z?!(1aDIxB8h?@vZNWQ;SB_kMY2pdriQ#q%u;1=99niwb93a?Q6fo z^%uX^aQ%74;nyC0?UMU{`L$o;`uJIWm{bJp7rH$M6>O}m`Vv1nqj^U+5uj5>xu-bWwKxGuH* zD3E&|BbbC|Sk+-U`e^at_#>ihLf=dV)J-2Fg(iR!cEcnMJC6+9(#5FG7s)MAc17^> z(dCC*T$wf>8nsGRS~+SQTkf+p3!hx=6V79Aa_wCpfqkn&dm3RGn<_}{J-24NXU~LI7VYPdIr-TJ*kA>l>!>nbD-{;nc z$0QgFALK`|AtPf|?+d5t17ekMICSq9duqY)dCa*}Jn(WYaBJUb%t z0j&%Dh!*>qDJ*M}Z%waCVcPfa2aiIf#kyCk5>*a{+!T~Ok~1w88IepMshF4>?FXMR zdboNGCSI2ygczluchzVD-%7RsmhJZat#AgAgpB+_#6b$Coh{%J7s;05McmxCytRzD zE70~=-+S+?{Iy^0-rFhjuQu;>JWg2e*y!IIeYJhBXLU=Vkz4X8n8PuX1xq zn_iHFsmjv$Jyyk9v5<=+aKo);sm4wBj{E)a4S!>cCw7NX@|cH1;&kB@oZkEDJjuNm zEZi}gj6{)W6=<80L9MZ&y00$Zd!`UJH5R$TiXB1P_cmNL&GgKe4_picFZFv*=bW|N zU&yHnoGRY{=Zen4DSB>TMyTAR; z=qo>XXX7jHyz`Zc={e)@o&Wfq@mJoNGQDBkGOBm_uXNmh`JKPOwPyJAop-!mGX4%j z+uwO-{LWXFOs*Ke_RjdrU-=)uJo(C(zjFO$pugO4{U+mo{&LNA#(2!A7)!?A{PH)- z?2P+i_$`<SmL&r=Zy$4A1{vc` zW2S>xZASXimkxQ5>+)@{V%7{zzR$RT$DF%+#;M-!xn^E{Sh|xL9}axyZ}neXzBT${ z!>AdvGGCPE?ydV@eCw^@6DBP#{aYO)T`KPFTMesM%zTswvSyW}H$8m03< zD2-~2OsRcq(|{4CVoeeWne_BBq(}qdOXjNQdL_%ZV%nDInN1Ts5FxR>(&mA7QKf-hT#+%y_Uw=id{xQAMlO zk%yKkiEwfnzy4bL`rd1=zy8|mukm^PwfglDE2G!CxKCKAn5`Ji>l+%i-d=xg5jGt= zo8i~K-m1(fdfMaO1hKK(3{w zkViOGxg*O;;Uvn^ZB}mi`fgad-Ia<&Et}Wtfy3+LS6=O2>0j+%8Nd2U`|A3s%jxLV zHa7cwoV@zVD;@SDM)&IEl~=>JWf6Wl4xz`he`OOB zZ7Ogx+yk9lj9UYREpZZP!_5xMCKyyf5Oh|O*M_#;I%t#J+sskNoxsAXdKFv2l;Eih z;esEttY3MCS+dBx#vzjFG^E`!x>xtYMF0gFR-0E=uWlDVBWSs+k#+hxQcl9(yUrGof`$jYB++G0Abpys zc+^1*TP8`5rFZ{Gh3WRsJ;t?KI_{2&dFpbxjTg**Jm)&3_ul5Uw z5@FVuqtHm>_T`6$i%(9(HqY+monc+WT^?G>0btc!zj)1QuWd%doO+dgr}DAm~r+}|M{N#l+iKf<@u0%^V0U` zU((_8*X-!=f5lz2Q}(~k-I(1=+HqR=W18jX<5sUCgATE6%&_S|;wbHL~xh;5kEFYXMRt{b_1@m}#_r~lk$fM(ov1g-kdZHRft zWyHJ-rt%Wbd;jA2b1bhw&gg>hF&o3-^Wug}m2pD|lBi$YmIMnrU4>nWv1C5gLx{K; zb)0~1rp~u7J}3YI8sVff!uX-Q13lwaFSgJmU@U4?z4(+*gHZ`(#iA-Dwefmgk}9H1 z&Q~v1Ja;9*HaWdGdSU+j#tYBC@Iw3i_=V@&7y9S>7rN(1>(TK1%=0fiA0O?QY1f7q zlTkQrvBge@b@TkQVV9Q0r3Lc-lQ1<4HP#y};t~{^=O;Y0&u>bH8c)4s6duAf!zPIw-?B83tJ@; zx$0IG;tFHL68NdyjYZb2>I2RB@W?RD{)J@_ep0sX1w%w-B6LlRKULRxg4_?ULX zSUxxU?CQCl&p!8@pU-wY-Y}*yCZBzd&CzEs7!Bj^Y6Ks?)*88KZgb|0nM~ zo9sBYbiLZPyI}|tjRv~my&)W734kC05S9&qAP5`^IE`>d6<8}l0!d#}pOW#09!mDP>LHdXO2-)2*( zVDvC1kU5~EzkmUi1$hME{_>S+j6A4IG7SGBhz?m=fB6^m0vwD)L2M*JpDCyZzplS8 zem#=B`ab=-`~9!K|Nhs@TCINH`?W1rv=~T+k|3$SU$RvP&r;Kv4VB`@-?tSN^HB(b zkkiC>%=Fh5R(_wdn^{3w{(i=DDom7;@+FNM942FtFjIs1glF}A>(}3}847{Z6Qn4R zhNFX0i1TbJ_O+LX)tLYK`|#@|!1z6hyj0^l&P&=7y}0W8E-clZq;5@$tlbJNz~lE2 zQRTm$vfe6!&Q}ueIrW4WGcRB0VTbxf=jDqRFROLk%NOxwTlUe*q*)7Fd>LPCz@0E1 z;)`U`Wvy9ZD}v(7LNa4sa(wxs5=t@=Qhd?EB}gOZ211BI9#amF!$8sl`^Age00EVP zY{9Y-(AF}(m_}*Dx(w3PFZ=GQymsK~}D=j4^-1bJsH0qw2x)+X~TM1YjJr8E$LBnF%T zZvH>MEB=T7^4(v3x2*B+B>$J@|BJ?d{O)%;{_S`1d3aVmFP_EcooCOVY3M(D{#-Mu zjxq{7eF-Qi@xY2yFD+)k^`NB=$&qqxZ<-9M(^7*rYCwOk$JD%PNf(P%?aJx_v z2ZfO|8d`WhjW%nN9NQ|qnpkO{S~Fu#xG8Fr0TF_tdcMWN)kB^Z6`qNA1bu(w7uWob68yZA{U~ZZ@)3GKH76f&cfD;_Kf(>3sd<$=82;($?@-PkxbVMY5d7 z@=5wSYW`oJ{Es?T5>|sJf70=-DQjw8u`dr~}(kLt(8qw?|8qsNaQA>nb* zve4Ln)M$!FV`=Kgtw-`tnzD?Klcabw(g;p`+*W+hyq0TewxF@|SnBww&tS8z%?K|I zf-u6P!L*gsp(io6ZascfJ??@bY6^J-A;Mt7+O*QZuab-ft{`yZBoNA;FH8c*k9!Ii zZe=*OgrY4KT{l3=E14qXxhS&(Rf`)80`=moRZj6{RbBB;T#FUV&y(mMo&{HWQJe|uvQ7S=Q*1t z4U-BcVR71#wTPC_``I-uq^v34pQaB3?;X~#7~ZGuDhTIFD6)9CrsY_ir-W+kszoKx zT%9r=!e<}wb&|e!o7`xw+Oh}5{qUf3|G|U%l}(eD#r^t0yx($FZR+;@2lv+=xN-P^ zRnRIu*hpl4P7snpFczjMHI}5fe}CB`$%(8AK}meM2^9G_7CI6$RuB5b>KQD25`t-p z5Q4}umJBV*31T#R^z@)n9n#F>gPsFaViP6RgMpM5KJqM6UGI~%sm|?{1NgJC=lhwfbt;Ff%&bgbH-w>xgbxzH`&?H*8NFW%jtqn;e@#(UM>>R!^A?oOjbe>dDKBpYmQuJS4G7WeAANfvyId*SYf z27*%)7-erM#l5byq-x!hH&`g{DTer*-(TOc@yiF4+%+p3Mf^LyTN@z5DOjFtQyhUsrb+bLq7QwcA=e8a{-!ASf z-|jGvcSrH6NVXZsAx}En?rH)m7%RD(Yvg{0_V!nMw-Gy z<;Gh&yw%!kp3wBVMz=QQy2Mx2;RM5_oH5)AVrk78+*-A?U{eSwUn>VR;*H{qa3g(@ zZnVC*5i}HElp04G5D@6+uc7~Yyq1a*yD}1ra@rw z#*BFwMEpYBqr)e;QPF!#P*IbGf?3BKT}vOR2c*Vm)N9LwUuCoLjgRngPBesRoU}@O zL|`m<+Py8?jWx_|-IUkOt0;dOrk=oTdV(DcWNq|wVTB>xTHU^|n_a}R7 zrCHb%(WI~Qu6z}XKDt#WW zr_U?R8B2`_YsM%UUUzHp`A8l~5~M|{>z&W9UpGhKmnE+x1dgvqrCN0dQ1D-skhQu_ zezb%|cltL?hmvr;52&6w`mHjyt_#ryz{B;f;;#!QT2f~U=1A6BjxZi%pwBHg*%0a< zUhl~_yF&~bguYjlag@sQHB89?LZuu(IE(9lbFF*z+O?}!%WK8e`dYlYrg50%&9(Ac z`|7o;LF*-(z1Hkcl1hU1ZJw9cl4h&d($)X05wAaA3+DANn!mc%5z5u5>5^Q=8V8aJ zHR$-07X$K2GIHbFYdw6fU417m>FTm9mEzNQrTgiXPp@2wpQbCVPc_u0 zjGvYogUt)+k(@#v@)X6tvyub}&Mjn!&jTUg=WTcm>V-a>hSiYTGdhUNc!X5bUK~9>Xcf zR2ZRJ<_~ig8_bQ`-9yebOrwa0OVbmWDi;HZC>M&WO{@${n=D7X+yj`T!l_B`?h)?N zQ-$Ryvx1&j;{dnZ6kJJ*tL-0X+8nP5Ymn5|K;MycX;ZdZ>DeCX_2pbz-k8gmjgdp- zlY^T2{{h`-I0frwHj)-e7p5*=xOjnQyx6{Q@nU(QxL99E7YnVE=HbGJIM^e5UW{fB z7h4xDRu@_qx$P+#nLhIpYe)F_p#Q3)yoi{^20WYI7XEul%q zo&od=#*XYTt0bi|S>6lj!bXo!kRCW0y)CwcnE_B{EwZxJ7aE&ch>jOFWH(l|m7ho; zZFC;#!Za>MEeQzveH01^7iN5-xv0%%LKe=PC!LA%gntJdI^@L#S3vy(d0GmKxu`s} z3JZ-?OqWC!o8a6y8|V1`o~qEH5<-*2<%PE5*x+!X4~8-D?q87az-kV*{aSjj6=IwT zjr2LQ(#Y0Rj?MxLI#-;J=hFG&TzNieY@a)SzRtRIu6_R8xhTCxX~X&6IZe);ujCL+ zrsQC%TCrnE3rF0C=QFc$dd9H z#H=fHhn}_>WP*9bbA~50q1YqJKN?bXu7%r2O-N2NAxTFRtp{Al6NwmV(LoDe${$M{ zv6K&*I%lPW-iGpA&*0CmS!zPvNLwAo*K7gQDbQ`+<)}`2q32C6H~>op)6#w}0*+DI z+IWO>1V^u3{Wt!#_RTkVC}SmeZB{rp*}|r*aJKklBpIJgpOiKhpG1vFEvfSSwMOhK z68y`v?-YT@AZwO1zLBg-zpAl1+xz6~Cuh$JYHZ6H7XBm#<(dRkSgf7xUhLlY;9qvS0ungytKfz(@9!UH?j~SA5i3ecRHOcPSuid zvUBR>Nt?2alA)xORFWV;U!P3U^-i5Ur6+~~i<4To=dx6XYY1I^z`7;7gpIN3UR>Ibb?Bx~}C=ucTFiGC{yCt>l=GXAU)ip!SxcPClD zmQV^lBL`(UJ~=+o|MP-Z07nHv_^998b+DZ z@nbLJP^dRxL2Sj`!|^G~D(IZEX9tlT_Bk|})7HCk#qv^qZU;RnX??V9e5CN);3C5l@#zP)b&-jw$ z6~vsSVm3EZ!75{_2{N~Mq%Cyoyw=is^QO!}2iQkX9**`sM$NCKf@E_1c(iro z=vXUp6-qFhHj@PCl7^JLN1&76Ew_TH-wDz3`)yq z+10H~*dVAP9qJxFbolV0@!@o6`tTv9hYlaA4;P2R;l5_9qgK`7j#h_8hvT8);g8%P zn|b3D6dxr)4(V{Pc{{areNMWArRYHkHd1#%iu>4NFR|k+Ldbl)^(iMc16` z!&`C?F*YrQHDfr62SL0KSA;(V#er4HYss3{Nn@q4b?`vYw3LK{KOgKIIC$_tt;G*MB@FwDWFYrw zYcx2G^0=&V?O-(PpR#VO5mfgZXjUEU9XO~*=1?5?qm=Prmy`;J8w>&aQS!sVww(X@ z;4e!12dzo{#+Zi#aewE){{08){bDB>?N2t=``ZWh%P8mltpoexfg}S?mF6@14-lir z{%~Npf0`Kz&DD-9r6GVBrHT8y<`Fbsk#1;uOC5x`VlKFh19m}2K{!Is9 z;Y9W;V8+)_srD0~ChqTPC1Svmx$;`b2+e7n@i>rspy7ZVZB^~>8)JtnQBt6DYbceu ztW_&kM~n9+jFlll%P8mwgF+oEj2iv5R0oVN6f4k7?VDhG10l-UfGN{eM-ANjLL%QO zAdI}XmlTyb>g@Dsv43jszI}Un)cfMzxUa2Q+!ywyeZ}6eFG<@os}{xHp%fV6zSdrO zqrxY-&%V8*tmq35$g$R?=?a6dG_MpuVAMEme)ytI1{pQ?^aJyDglG{?ZqTG7HwM!9 zJnbz6QW_X^#hnyU%&d%k^6R4$xl(GP1I2Wt(5h>-qOJFBU``cAZ;Q`yGo4r}20ThJ zOqm?hStQU5)r)PK66o>1##$Q#@_B}wkVt5(nh2h>%IU>AZF&hbLWSPj*1o;3H67&M z(3dw_=PLK?-8%tlzTcSSN*==&Q0qd~^k)YGv8DghwTg$BEWj17`rwe|{Wxaa5H z-CetP@7lGxyO5+^GrM=`Vb3TPGLpKrd)J%YZJDa9EO*yAVrcqzS_P91;ltfFjHDS$ z@O8MfYr}d5)Ac+dSym0I)-2kr)NGW~k{p7-MM&!byb~gIwYx7J&sXy6;P7_0q3;p_ zk0|9g-W}!ZWry7#$Zhh_q_TW#@&oft9=$YlX;+ettgj_72o^zkHM8BuT{-#&3v2fy zhDMa$8v>wH?~Xg;uC!BSnWSBX*457buAMt~?b^Ak)T+-+f=AdHcC~iy8t?4MDCJ;h zM-#b;nM9^iUc;SjDXX1r*~VJecjw9X2GV2>JG-Qi8_=HFd9rp}2WCc4 z=sT4#Nhl}of&hRUFpyl2YS#xg>R{t86_a*uu$4R2N<@_Eh&!i=!6?wCKk%?x@LJya z(R;BI->BHBCI#)KVj#+n15jGACFWDLNB&^_*hZ zHJz*U{sL}9cWI~<)$ByHl~ba#IFgdiRMNln}w2aYaH5hy!zk(6Y_YzcM}cWd3g)lkne2ptrUF5c0dMd84sh_|1H=V<=gb z{6n6X^Z%yV(tKyf{QQon=}1yZYDtiwdnH+!PdXBg=8Xg^^6&F$$2*P75+dXLFFIlY zYfV-n$2Rw9yg|Y~o+s{S$)6VMHRN=BY+`?9UmT+$e}Z!l(ls1>-9txB&1 z4dJm8Q57+c)tcK*iS7>jH1|#txAzT;4ykD7Q1Lct|L3MmCvemwb%Z)rpeElq_iB4J z!K{U_jmKcF*fyT)Y@3_g7BwBtwWSX2>L#!-_aK0k?36Lr=DL=$mYVq2a~-Ix$n#xR zVS;q!U?WXo(weh?cbdYnl0>Lz3`S`*w<(uK25$i=mU7B47evy!vnqAdourv6cTX@= zZkgvnU(fY3@<`Td?x$_V+*`@dl1lO$$=bGGbX>}-zuWdVn*Dj3irY5#_nQ7e@-LGA zCRy9|zv}o8+g|DT|7;7h-EFgal(TIe!)#~U?CiFBR@r?TXQ#2-GtL&qj zV3jsbHMxSElChG8XmXA67#vseVcR&Pj%6EKnLv2;#VnD=MzooeB`BgbYm8Biy((ve zjmEgI&)bU4Egi^ID<)E)(g3d0$cvc}&AqIe-s52@J)QTBd9*q}@^aI*foa)9?9%E; zin?h9Wmf8qwZL|XkYL*;LTp=PM>?}xXSc4+7F(5iYkPLL-Uwza5cKSIG%@H}-8aZ4$?%8qZd|FS*0tbjYg-KUDa4iDoH6> z+d6Ho&>NYpXWfuf-zJTkYC;Yg*@nz6Yx#==Y+|deiX~`hi(+=5vE2GcGiwXCDw_=u z0Bcp`m=g>Laja|FOaoCwIla*cW1Pr}1l7$MWpy@@Ug}t8ibKFgewLsouR|q+iTrR# zqxK4nq+=!YlK8QSBK=-z4P4mzSChy8Hktj^*8hLZn@w9$Yf5Wi^qu{kooaOSmAXiu zgZ*4@)r_7Z1hX@oIYk6-1m@A4*jaL%>tHvQ25C{L(>)SOF0p}O zn1hVE{RBu+%b+s=Kg7`TWykl)VS^f$cUG|CTISYqaD%&BNs1T|Y(eRnSlsdJC1Uuz%6knho@S zc_}9EssFpozuW$Y0%r;T_WQs8z88Y!gwi&Wd!w8pOnDqk6Hh_*8da0pNE54u+i$z6yfrhv)ZmK`cGPh;;&lg0T=#^ zv_Iha6SDb38!GiItNh1o9z31@Y3d0G=dau!ES(yv#|6=~2 z;=7!Qj?EhmI(ezt{(Cc9Z|m@PZmmDmDNQGj&-9-G{es`dpX=KAZ5#a0VUDxaww{f0 z>DmO>SUrs^$9Mr}>tw#on5Fl4(z^qWHPVcSPWmn<#{w*RxR$pV!Rz2d(a zR#2@#uYfiYq=)6_e`u98w`^+9Cu7yLXR~=*1XV@vsiHWWoG?Zz(Pmg4CD&>yle7XU z5)#&EYYC?z+P?EqfNhp^&3_}q>;~96Vd?Q7Zu`(QO%bH_)12=3IpM8n0B7I$&XfP& zCGRAEyKPy=fn-&}+}VL(=gzj-zcVGB)Bo3{E@poxc_Y#P<7f3B@!63i(6v(i#tAI_ zuYFek$)Ej440xdYYg2$U)C^ZFYm%|VvGfAZwywQyqV3ab20m9obEW>%FCKa=LN5kM z+^!dJc+q0K&0one>qy?!wvBGFmtdsUYiGO?k}Og$YUzaw1GCp@cqPSNkid_ZMi_Aw zK_#7F+p7}#X_L37H=r8eTBJnQUOv(PR7p^7`_L3dL>YKmKohH1bWEjlb@J+xR9e3_R9fc33b4m_s1CSYVUf9+4NBRcsx#q%l~PP|xG z<^FoNoFv`gwAwaDM|ru>U$gU<0rjei?36HhRWHBH2rKu*f(OjTb7S+j*Yci*R*|F zufqD1mumH5Ij=(Nb=ff2*UPg!bP7n?npM2=9JYVdgfx-7iVJ>@mS>YkjoUtuO)pjh zq?ghqI<<&&%u?vC^t>ui4rB{+(~|_{oa@Nr-n?GkzmV#0D()FshE9iiCfigXrPBs~JdI`?c z>Nlx0Flz)-Kj~HZ+TST3&CC4xod$c~LfE_mu)Mv>ui@*(W38L_D*W9Ddt-vP zD|m0gP8j#%O@xZF?R4No;(dU%?K4!RnZ5PlU`u(of{2z*?I-gFR_~e^cro`{BjWGM zSYGI@Dlc!ZyfMf82F;HaPk~4V1#Zm@Ks2!a?gg;^Rt*6w&SFhd=gqqxtn?Pi_7-m| zwYKZcF1@w5y=(8MDXrduvNzP4x6a}Y1=-tX?y6IVK%GsB(9a}sdap?|B$dDYWg5NV z2bQ!7P#!$gTpNQ7{>Gaf4Z{z5A4wD5(bM~jyc?!>aDg2aWl7Qu54 z_EsBUJaiUHJ*BBV{r$wWy=PV{U46@eo`WOr|LFwZv6(OzhB9}l1W@2oHAEE>Xr{f( zDFk?eVr>pPdJaOXiO}9yPMvz$%ilkx*0BTST!KNV_s)MDO70m6NMR`L2pyiJ=^H*WAN~Z+qYP36CoYcye{9XD41!S zED^Qp&| z$#}=lI`XzNEqs$l<_=M8|CxOuH{q+2KS_9p^{*vs64CcWjyGz4sk<)Ikl= zd)`5Bn|D}6P5RkGZ@}uUa5Mj_0Y3zfkL&VIym3j zAp}!MS4cHYSQdlx4*>KCoZnGqTTWE3S5(aF9c=lG zK`iIX9aGsy`g(q|<+Y}O9Ogq)>}JEw?b@M6D^4o~(-F87#>p!T^Nf1a-gJF0N?_AO z*aQ9w1-vwY^@BDk{4rQXbP%n1;*ZE>$ZN9TGKfj>QbS#MP zf<6GUpp9D4=Pwp?$}H%!7z^Y1Qb&CjV?m$oFe?_;2$6BV4~U*iT8-z^!a(DX5^(eh z4(SThsRb6LG8g8B1u`~ruStG(I)ou(Uy={`^ZYxDBLXhu{>fcJGq`24oK_mA_9yok z`Tztnn(xdnEX?ckGm_2bs|Z3+wxx(loffueW{+&0uNRWkL?J%cCw%7h@u7Kr0>^Cn zw2y*HTc!Ecg?8*wW4mHmGaWl%CEr=yO`; zR?N>V?9_*;^Z~1d1${1TA?$1|XxM^I2D324g$>z_mB{I%Qu+j*1xG&ar4NlssqM~V z)W^7{4S+*fm};^leW+>{T~5(tF@&g(Z|UP+I~#NhH3i5YG^8@FJ|LHK=1+w2QMAe^ zXl7&bdSEtTpikN@=rdn1gl!Zd0(IIbZ68`jz}!fn9g;zxl9Q_dZ3uTn}9J(@A=!j_=sf`{gRL z>HHHd=ro<{S`cK(D}wEOz~(aU>Z^ zevt4f#wE!wJNdw2WBq5%*Cekbd~CGbi7y|D97vWW{~`gW+Q|wuEO@+;5W~kyo2+DM zKB~F86Kj*{Cw;8(oz`H%W67AVWDmwQ|5)c(pQ+TR5bZONDo3A-+}eB!ln+?))T5Ri zKgMM~YPxe|nzVDcYpQW-9D;w4lL-5?CeAwBB=(_C^dLkbRFltN=1;a}pBz{1+L}qo zUr+m7t3seL!Hoh7-TI^NYaKYZ*{u`>CGJdKyvGM2FvAwCD{pZ{z=C)(6$ zp8*zNX~pbZl_OFraFx%VS~5Oi3k4QyrgaXUyZIQgJ~yh!z$bGdXa~B%KI+52lQr03 z*A^5R(@X^G!^fztpjTMFX-)Z>w{|rdtp#+A;x}5KED0qzb%FFOv0U_-dR*eJEz;0ae@f{e+vhX)dS}F4zf`@n9J^=W<-Pkvqax5*rV?RNDNEo93d7!N+sE&uNv(6 zVRzrqcAIlUXe?_7_qE;nF30XYEAoWAlO+u${Z?N3>VgUBS8@(?V^3SDmSWEzB>FOf z9E^+k8F_u%Ww*X`vzt+0n%S-Io9uok`9bopd-P3|-AfWYurTVID!YH)Go@&HAhl@j z+5HnF)omHy?rF=QuhyV%5cFl7-2(|ZR>b$6oLhTT8>yQF#5oz#vBLf*31RxW%x-f(UNaIfspuOP`!6%JyR`r|611; z^Kp;~clh(YCw*tlY5_f3E9|RTr1MlNK+s_?-}|zs$|fY*SlYbdFQt9u3s3KucU1(e zBmP}3E1C{^n3h#eY*pAdoYV&O11BrVR)XZ)SJF9Ur^~9w;CtfB^&nA#2_335mbQQ9 z%eIHTZnRTDu3f9p6Ku{D8LlvH$bO`e~C}$i+%CVN51c<@8$*nj-kG= zr$yXX?`_LjtYk&B(zp6%^LGsGYk&ULzkT{rWc05b)|%>@llbTu_DxUR)Cnm?TOJ~T z2VbSsS3GU*05}+t{6$F1&Q}uoLMJTjdyV!L&#_kaB}Tzu1HEf$gSPm%w!T8!an_6>?^$mq-?(6So?P)-4OOp5kkJWmv2u}ME?G!f#~~k!i5l! zzA6N5%`t8MMyKK@Wm)fNoE-EGI)(YSP|3qS@Ks6N=^|^|?tOJ@PO0!{Rbc14rKZp~ zNp&JwymvHzHI`Ii-v{KhO|wyfO>=$QJ_5xYoSu&4W;a#7<%pB-% zo8G@~|Gs_ub<}r8rJrJrMqj`+srI#{P@gPlNux?pAOIa4$L4@iT`?K&`w&BZIvfB5 z>3gRVAX&AQ8BN%?xp9Y!=ldWt%Y&Ty=Cog-#r_JaZdx-0BLmn-z_3??-5+kAx5#Yk zeO+knA9x8E-$`^HNg4Oem=TAp0&ZkRpLsJf%06`Zdam5*YiqrCI{9;n`l@x~v@a@c zQh*V5qMGiP76w3db83;a1~v60k)W=qGAx7y>|@TUZ)g9@e*XskvPQnm{d>s|`}ywo zkN%zRW&4i#zh%>Sf30tJ|G}Je$pDS7C46t5Z@&-r|DxmXB&!l2-^%-)MxcL|{3zjz z_DFSPG}tGs-L9gnx>p-mHJI-u{jI&e@|bBJ=#6(SD!RU0&kiYX7ySd1OU2RC82C)awY z{4x?;Fd}B`0|pe8x!oYyh=(qAAkXH46U}8NYD;=BIo3OQtb%1}@aIw!Fu|X-&y!uA zf@@s-a#-@PhzHy9AytMUBp#Y!@MkS}Lo$-W zF<=>MO9k@{T2TcNxVJUxswt{c?i8}w9n3?HWBE|!z#ya56b`jz_AcmBHCB;eD%4t9 zx#{4vaUvUpn?9wy4LM7Fr~{qq&<9c&F(0fI-W)3f3Z<~2Ec~&Sy3~wt`#Gp&Pn67e z1b&s=qcQdD>#fnXXH-*O3pQt<(CN(U&_P|0Mi-*tX%8;9!^Lg5noOPNx*`o1*hz;r z%LUgQ5&cR*x{6E(jnZqnp}DqoE;*DA^)m$5&{3#L4J=$1dm8HFd*`9{QD={PIS)o7)s_KoGjg zVtnn*q$$pZ3k6XU2~-Xn(Id6Gb=TNYmQ@g+=v&BJnJJ< z%^rAzbA7ssmR#0}=~8O)gR+(17^?TS=*W@r;gRy`N_Gw|0J0CHQLt^OgNltWyGFyX zt!(zfim7}%jwm#7`L*&$-!6-GRF`KX zk$ep`U0+QXWb+Hd$&N>}EOarpNr+wb&f=pbtprjX=~~igfWpv)*TfEdRCZ-O;Gn{V z;qdUQ#<>pKxgM@NM}z^aa&bUi-%VmEG!8QpF71}#ohCdSd5f{L>%!S3vQo6F#lw zdW1cXc0!p1Eu=YWqX7$uAm1RmRUP?IYdt*Jtb~A~PCJbzn(RKWjfHPWact>maZHys zJhpN)9n-}YkG($HKX&xk(WA%A5|4IS9b3)g=%@-lR?1J;13b1Y86EB59gnu<7C0V_ za%dgX&^oHwl=Oz7O_q0IS?Z%bqVSbd6Q+v^9@CCU#KB0wN)ENchMIOwscRWxekbK1 z<3;dD1g-k$w1smhGn6i)DT^+ph|YC>oS5K&m84TcFZ#i)yY_zNY1xlN#q1J5RifD|<6mFohx2QNOe)mpQHc zs-(wt#Ztca5NfH`EPAV7 z*i%>Lw5P3>Ex;~(S~eF7^~rmGa)s;cf28S5Pds$jF!m_~@Se+tVa5ZJXKvzKH%Bo%!N1v}+#`PAC-t$;% zuER<=zgg2FtWIp;GRFSYRf~1SXI)*HD?D>CH5!prRXJaKekIOb9v>;(sDKBHOJ-p%Ut}KD@ha6 zT%vg(9oM1eiqu@0*{?25t~Ci)oaR!`%%QxhImF03HZJe9B4MqoGlQ^xh3n{*)+ZXe ze%WW5z@@F5%Ui#*lu4JmPNw5((4lD(&Xq5Sh6b0l&URSzPk#LI$&XK-9Dkfnwmv>N z__#P(ecYC&{r%W$`C|4wJB@II|tbH6$2I)59d2#BOe0_5+ zvF=xKPrCkj>y(!7B&A>S9IIcB{m(~R|g5SS&j@ubqsigg-pVh2F>6^OZ(2{Z?M+5iT>oBbr%GlIM?O^HaT!@ zg!TBexQv_&_cO@1Hy9hOWVbMgng@yB+JGA@RHvu7Rf3+1Z}@j*&E!Tn5qc91dgA5I9mFJ6hdbc{Cp zpkXRJ2zw^1)C~`Ol@oWJC}+pyrU7ebdPJPjw4*`3xdDKX4yn)Ro*{xA8ysz%_>N?z z`<|((yrKhota{e5Ipw|rI6O0BSn-jamNp-fb8=7#llc1ZC z^!%nM@e>s(#kAivMMv&y!mU>7v$}JNKhE0SQnVM`)5Pz7!mU%n*)C}EB&Ou9C~~O< zuKEEUoC8wTRh5@c!#r_ zY{8uPASx+S8hiHK2QQHO&e*MCJPMN9StDC%RG~HH8FJ2#C&BNGLHb0S_DLTPJ%ZdR zmfOlybknrZ;-)q&IcUO7U}8oc<%CKUCMAv^||Vk;#~d7lr3b5TB?y!>Apke z>6*4&<0rbEk0gDEfPiGI%%n&|7MHni$q;s1m zD5eflSMbFLJBm`JsAv)5=-PCyg##5>Mn!~Awi$TNAOIt+aC3%b_@ryPrZ5N49h2N; zq`@nmG6M3|Eu)lVWVDKNV~sGvp9-p`uv*Iwi5tX;g)+UPgfSyWI@hBU?1}DY)iBkm zOE>aY#&grC z&{`Xs8-IC>?mFgd{Jv=KRm+t7cUi@LuP-Wairz%)u$UUIDA~=`aGLZzo!5QKJiYEF zX5ELp?V||5E6SUQv`!ucx9_r>kp+5T8Q4U>vzlQN=FxilGA9 z(p6>_#S7uQZbgXBkJ7}vN*8pmH2Ld}hXy00cz%;ZIij3_@GLU(Bnz~3mpetabJmZr zn7MH~AH=)3Kypw>G~Hld&^at!X?ilK-?DGa7&(jc!`!p-gxGXJpw2w^PN~(-3-U-p zZBa;#M%DV|us#L+BPTd1M9U281>mDBj-?;s3tdBq=SL))I9p;m zUuNc->IQ|DSGP1Ih7MAn?i0wyB-?R^h>m*R`{Mj9kDO_DINyb!Mk|rMmO2~b`Kg9| z)3yuoqRxto;|ts_F9mpYIj7+zjQ zaq&mZmnGp+>*A$V_c35W=@z}lS9jXIxQ6MXCeu1nxc3fZIIiXF&KFl@a;myJs)bz2 zgehZ?1vab+gRJ^}snShpN0M4nUQU<(v&Pq#xli%x<-z4(_E*v^Nd}V9WxFeK)HIkX zT^eUozTxiALRpgvHS)&LEbj89x6Q4RFJJyee#^20^JfW=zm@o1lHr5pUnDse8mkf< z-W<$U{KA`!4wF8@!TrYo;MEv}TG{*#XX^QXVjact}2%22jnG=C*o zll;F~kM8e2MLU!%N&fdwb(88JHTmz7W!-1GxLRK6UcI7+?#O+0Me?s#(pB`e1YOjc zvA%+4aAm{QD{?2|%2nOwTXrzg)%KOEHV@`Ig$u%Re5LP8TMeYCu9yQpYZmV~BjJ=< zgE`im(dX+t;fQYK3P(8AS7wY2jI?NL0OXBiB!Qe$FO(nac;XXu$8M*NN0VB2H@A7S zCMB#9-4;FjflBnq&~&Trt4Y!#IZ6KYO7t7YUyE0ZYqca^jo0KPY3qLN;p&v`_|EfM zb+sdf?8$BeFK3*JYvt80H+DBev>=CRT@zBcI&DS}Jj0fZ$L-(^I0&P<+QaRtfubmz zWDrVOt^9a6N8RpTD}2M%4;7rzY`Au{Qc$Zgi=Uh+3t&eCbzl`xW)1JFwRw!>QAx%U z;PHfdb=4}Wb>sTz?3_xvHj)RPhGM?aed!}km6Fe7ipmqN4Rc$>OL@HAbTf&cx4p@0 z+=cEL;5L*P0m_TlR%C)A#gVJDwbkyi#9(M@!7*OlWG!pDR$iU)wff|Rs(qhb3!f?M zvpiM*K2wLJil1p?ZJfIH*|pE~yjDt8OWL354AGbrl|E}-`z)Z+ab*58a?Q{9SzDp% zrFnKu8@2L`T|l+!Yak?ED?TfQNaCKSbOt!^4CabuB*2cM3Oj(p$xj?!8LaKA(hX86?7E`c8m7!kHV0MP1)j{r2%zW#rf0CE zt_neS_h9Iu-0RR%J#6zaBc4!g*`!Z4QH=8d+=acl{F(VY0@oH)Ypff7uQFUAgLt-$-BIc8cWI2=jnRV_~*}C z*FPV9-nsty=hxS?Mh2fp!x(E^(Hg1c58eoW0DhLBsAOn;uAzPXb3?8jY}piJSu1(H z{v6*we%>X|^;OMRWtsV0F;eIWuO-PF3#-Tiy+27P=Z%DtRvnz_SOT+%Z_hw9?`J$b zRtyW~ppP`tiST*(MRDV;%W)$lcdSJ^hMHYO+wbyYypq#t6#Kk+>AFmH*eg$ zIlfWc97%$tmXwl85+!3?ZkTEL#z#!`%mXuGs~cUx02eK0epbT;tl)fV8HsZ!j1X@Mh&Pf#Ay1;nQK{SFh$p30 z4nw5`4HYodIJmKKoyHA$5%2yu#+zzdZOZWtDz7b(R}W4D?|Sem3$JsBfEp+UDpUu2 zxG}9GO}%-e&qQslb0?isQ)ZdFante&=T^Gexpni_&3LPK^Oh#J!p%a0KHh5GycKWO zw^XZ^Eu6Y?y(MKK`G7cr(CHDSGpulH))epASVy5+{LQv`*GPe=VMFRrVW!M@smN0MMD=Hjd*4*rnB@@jd^@?gIhUT zrF{#zsmg-Z4bPdZ71o*%G6xOt^QJhvaI1CGdPA?On^PXgp3!P6D3DVRPwXcEh2Y>_ z*B;3nv^FrBOb`5w`OxE$qN0&P2M!p&oFT7eHpoi0q;%xzxtc75ct(tw zi-5ByRpRhLhBC-(C45Z+^7uVMz)hf%%<8!~yNmJk@@y+qniI%dqg?bq-RgO&sv!%f zft8EDGvqk7IUIa1-Qp=>(z^ZSFSoT-w|igSzWwFxFRRkM_-~R*o*i(PZBcwVlmdL*Uf*8J+TUm-_^qr%jbq8H z+aw0|m9z*k5ni_~qv`LkPNBQc8X=S(Chyggadz%s$k*zSFvMcf}@#9W)(CmL={S%F!SKnNy{L{&;S>8d+Dpzl~fb!P)p ze=0o5t#$X#=^#x2;)yuV<^f@m^b#`fedZx|eXXM|F2|o@IpU z?o?LD6Ymay1a1H-*O2Q)ElH`+<|m(25p8FlW&FGe|i!O2xf_ah@jsdJXr+ z^5~LKv*KQLw{`Ds5RL}mD5h(SE1R=U_ex8X?y0X@7m5VcVaeEnz8WMh);=S1uc@|f ziX_FPm~}_OdLA+$xsXSeypn;o(>XM2xRDs1)!h%xbyB(vxr|Ew!I8j6}GtxL~5 z@0VJVEIZ$4Hf@EG*o!iUTpbAu1IM#1pP?loou?EqT;sh>4&%I4a-WPcRe49KvsUU4 zJRn=|TSX)(y_HsWd2b%j_aBor9k8vAlrJ@kzWe6(DpNik;(gx_k1p?R%zg|ix7ix@ zBnpUqr8V@o_2B->gUOoJg z@~@>FJZNhXq{fAik>s__$2u-a@QV^agXE2*&cNugqsN~$GJb$JmNiM0$C&ewgIwsF z5rm}&XqF{-MB_H{I)e{Q#JDMfH18gCsYd}6@lFC55JQPm(ne%`B@zMX2h~@_V)!a8 zMvbdqwHLoyT(Mba@vE<-Y!tPWxFDt6gT|30e6{*jTwF81pX^vl`$x%=WGIPWwHCkn zPi7j}lAvPo%~zIzsbdX=TAEvvXH_=xLJ`!puX>RBN)rruQGeAp?N`PJe|(V0x{Ep?uO}_u-<=S~wI6 za&yvHNk)rP3dP0Dg#1S>#j zv3{rxu^3B4RG@m2QwEuL_yQ$bGct;fh)4<^x$ zT|d-@tQi1%7sSk+2})L7nlvw{iuJ9dV~JAX6Cd{A2LfrFj76H(yMQ%4l>Lz!C0TnE zAGRJnjE~a84<0>yq$dZH_^7Q_`RGG*@9FVYEeft5O-t|3sC9TWV++IR5EISAU}e>I znU~HrghySWK6*ILIAk3?svk~UO3w%s=*UJZ z3B6#$qiP+RWOyp!Lk)t}SSf2;Bh-Mda|?{sSpHoDVy281@<>ip-uE09RypcOXv0Sz zxWRjnv8jmk-V*(AXr8?2V5u#W0wF}V)MPm`+gWjIjV(SRsUw58-{k0t0Prf$O zK&Fv|kXo{45VC%qv?36}@;Z+IujO^A5&Mr{qa`)MoV2Twp#&Z9q zN#~m75Mg&{miQl)PcFOOj3)Dw&P=1D14EfI=fa7_|nRZj{n1yD&-Xt@y& zoJ%O9Wg@PbeAO(|OgOVkIjbs$6XSW%F7TVaOrjq+{sO!8$CWCp0v zs3cG&iJ-zaD#m@m>e?bcnMOqhYX(gM+hc?trS6$)t|b@k^$SFgS|%t_MpGgztkW_W za`jDHFt|**pT3!PMmj3a_*(BR)JO>3G(@FuHoCi4A#UGvoNbeX?c5+D6vWW<)re?| z=zRL7??#0Sj|A@T?Cnf&mibgMmhbt{5vyBZP2&1#`nLV_+i$Cw!eKURn)wE+9IGd(_0;DQwrzlw{I05fqZIV_*5pz*74~UOo$%# z#0-EtmWp4sfSGKU7fEXf{DUX*ry~a6}a))h6&I!<)l*qLeEr3 zF<}X9^}{)u)uHM0a}`Br*vG!-(9AfKN?~-EDf{FSXqFdJ+y3IP9fhei@uw7G^zWY^W$5pMz-xa@#-*u(?PPRgp;#Z}OeQ9{Ul2;G&ci%02*JJ$Euj(AJ^j%bh zqNNMpZ8oF1qA4xOn!tkOO&*!Mq+cb?N%&eq@?a5Bv)V*dm7wp*f3=#uh`?Tc*C7q= zFh&6WQL>!pEAC>rLQ0vo+_YNzjuM@^bE#D-$iOVi!+Fv$v@vsmjx&YHz%1TIuZAe9 z8L#uRep%mu@v`dgsu%5-FJ9Cy`!8PV@#1B8QM`;V!ppJ7k%V=PkB-I5N)oe#7aaoP zi}Z5&#b%~@<{?Q5LiM5xtem375nsOOc`An`!CQlb2yRJ9J)s8MT*U9Bc^_hs1$8f+eAr^fGB(YHUH%IoLE=wUt*{T96ftZ_|gti;Zyd zdSC_b=pogM)=LqO0DGw`xvWIDi7|F?s$Oi!wK0s1MkQ^cIO_r6#mj*-1-Rk=W8dB5 ztGLc{;n{Q9TL=So(#A=ewocBMq?gmCm#?cCj#OWCM0t9m^SfQC(_`sILVk8O|mCW znluqtW1>phNnFoJ-=Z#F=^Qnu(ue{xk>3u^_LO;hwTlcA(Q-53KV62*-&qAP(- zm;y*-*#w3j)Un0zjBgy644oXl1l5+4CAn~NPBb`$62ySH&O5+W1NoCJg0q+?iK$J( zBzdBTz^-QI#G8EMje`;$8A^7{DrQMVfaEn^5}OW8H-Mp!tD5X+6vm@Dl@YuvX|QZ< z8N&ah9Q&*nYt+}*32iK;)rWGm;s2<1l1ty zNyu^v)To;riUA6D$*yb;Kn59>PUfa51;_{+SFQ%^m`DhJi@sFG5Qe}uqy-o&jOhpr zg-c?|5bCCpj4w%uyT-RDjDSOo7``P|2O%Pr3!odr*|ddOX-bub0UGJ3)+5m}R7rps zQmSH5CPOn?@}p@8%e+CRF+${_bBUxr#h_40Ma)1v=Ct(1+PEdukwe&o5-`$`jCM;N5E*T+K_p8i9Em-B zd?dj{R8ojUh%h9iLh3e=MD4J1GeV;<2(mI_k3^_)vY~(%bY5DcsfbWkOxs%ufDYgx zx#{52)p?b3BSAXt7%_D-ZVoDSGCfOjyIC?L&-9Iw{OC&(b!{M8cxL`Oj=DLk3zAYp zSPoSbC6G|Xw>aX-uAp&RbsU66<-$^Q^9T-f5N2MLuv3|}5UG<6v-Z|oquMdI*4EyN z9?!hoTBvn!Mn9@G(6WhG)tcyqw>n}}t8R^<4$)L?EPaK3sdf~7^}$O}YjMC63~7vR zt@vbW;hv+GhM`vIn2Fu3g3lO!?P#4wVqJ^)G!1lmlB|Mth+O)aKOrUK8`NGooC28zDFD3y=26*{iLnYyZ>=@N!=S{X9pWi* z2`lwiCWU3k+9Ik|x5ZQK+os-j+tlbbW2(9>Gxat#HNMT9dK(5d&bQqbp+{9PHH+a? zk)TH(NG)Dz5CVzU=(f>fC3>1o^+gNF+r$l5hM)&w>7|$hEZMUdQ%Nj_)3KweRbrqe zbjg*2sHukFIS{~xWds6Da9sx_v6zh_if+94x85Uz3U3qIKoTeF zz2e2pnV}pE6Hm=)9~vic%qm1cnXdw|Xs&L{CXNX_Q8nc(fu$K!V?e?T_BuFAW)RM+ zFh>a9KrD<&3NU@0+o$8WJ(_OZ9!xjU4dpyIeGJ9WRX*zWczRVLxgEwaOf$DnSGQ-0 z0AnR0b-NF&5KR$jx&aFs=h4{rr&~0qFiS54P{fI}Jj{DnQ$5+&YF0Ub>=@kNlE6Oo;1=qNwG{+7p-m&XBc+`Gt4_?+)+fYe@286CF~n_ z^r7X^iZd)&+@a8o(83wPjQEaHq70~eS4r&cM~0SvL~{$T*Jbs%F;J&7^E*AmezZiE&gH!q%7> zN^?XHA)JW?A1$ei2o%<3X2Ra6i(#$mZ0Hz5X{}#(r3mB%Kdnr1GU|evF>KkglE+MV zT}gO+bY|>`Rs<3HIq5+=0v#A~$ogW$WPLMBby@8Wu_3839W}Fx_B6++nuhF(b5Kb{ ziW9pCzR^ru`teK)R~UtLCVWD~G62YmBPmd{jZ1Tm9{4Ikj{-f6)T}Ih@nJrLqNi(oPi7Xv z=t7l7D$~WRiAw*&v*J0~d*{sICz@mNqUMXw;pR}0O;b0BSu1rx* zq(CMBsVIY~;VCmL4HTKKu*BN6lvid_5{Zr)i=>>Fwu@kgh{9KyIuZbZnnM%TIYg&F z=L&#Qtz8Op5(>+xx(cOd{l3b7&)*l#bGjYQZ7cnh$;q;O6@9awB~ z8-QXOij6NSsXdh2g*=w#84oG6B3g*ngLVe(G}^g&1)LAfGas5KHXcU1<{iR0Kr4xy ze!)EJp?UKjdJEl)^LppS4_WizF*r{>)F*Zt`8@i^=MCZ|H?Xn8zI0qlb?c z0fw>xu?y#A<~IcMt%msx4gUOUUgpo|ry-o5mFxTlHQ#9HrwO}pLxfg@Xh4givPLxk zDuN=M&$F6u0<-!hYf=xU)3;5qY{~i=7$Ngp^PxeA65>v;KAKu;QSQTy!~BpaSZa$$2vwd|OJJcxh|8du0*Xn}KUdDK z2mys2+5j4JV7x%bQi9?q@B=dHUz$rwgLS-Q5G{sB0j+n~I0O%fs7njQGgvCgQ7CD# z*tc{yNI;Q#xD@3x0$D3)wJ)UV)ab>udDR@S(m>K6^(2Y~k%pzlGPT@Xwj5{n>}AWB zFIyfhvzIRuS%!lTK!ne*6T1*l>C=0;T2__lm!Y2_T!iL`4!4asjuosjo2N{x+t}xbOmV}&ngeZY@%Wydc z7NrRj;Fg&fu;P^oO2W&opsxlHwwQ-zOc$qVmW+aB)i9%WFS;5g`3G$dAh}Gkd5tL17 zr%3$c$1OUY5jg=Fj4Akuqy*gXvA$%~j}a=#OX@m5=1JH~8kT4&|rWRKNVu)yGtSmlp1-oL+OE9ET8V0K12?Id%)J?ogPsA(p5cQ)GDU@bP z2r;+>fd?Z~5Hc&DpfxQ4x02p{Xy?!$L?bYD7m_Q{A_V1_`T({z5@d#qB^3hL!>E9! zYoUf2z!Nei;Fn1W0Omt5fR+~{0`*C+VnmeaiC9eHm2r|hr6Kx*Xz>%(!WRj9LZYiD zoYkvV;}fkKvwGF4VV~8jgH_>bW0hJRuFAnctkkM#wJlcBs?2KWOo+o(@oGoAiWVSh z^+*wDuhnXmiJpR8X4UF=b-c@F`%PF*1eGDpXiGQApFp@K7(l_2a1yQEWQl2ymTDw*YsI1I>QLYZP3yq^LQqoY3%P!z$A z0K8pv9}%fB*RENs));F;G_}TByJpSWW9SypqBU6#@fpyHi)-SwnKf%mxERp;Vq*hf z&Dvm%TI(e;wT7TYj6zrjxaJe2wZLQ;-SW6bYl1ZntP=;SnF*cQ4|L$FA7kXm==l&< z85$et!jN6sLmaO+(J8{(U!S9hsEk~0j2u86i?IPS0SLt-e%?gX5GJt(j2MS5MTre8 z8qz38GG#8Y;KkyoE43L|#;l03X=gDXouPJPuB@U209_#yjTw}ec>PEzASok&CB+5^ z)ggr>UppvVm{@Ur=K1weg*d_w3|WkZ1yj?IWe$-pjzFByK@=^aGh3j!q$lg6C}J4$ zteJvrG(CwUIdk$jUHIsUhnh-#;KE5DIsF?)G;Q42gkxh6{2 zo5r}ZU&TI$N#rVa#aRu3#B_l?k_^PMpmQoox-17ZCO}Q$#%fxN%SMc{dXy9@BS=(} zu~Di=Nbzh!@}wo&m?VKjNJEIU4M~?exXa;_2G~<4MF%8ib514=a@QMNvkyv%ql8V%h@c!K|E!Sm=a%_4r+GM;KZn7YFv4rj=G(Twpt^=FYi=Mb;Ufk51C`y}b0l2iu z#MOgT5H`Wuc(G4}Mf7^m0{B`CMk@k_Xc2^r+lR)0{hI(z#UW838QRA$79e6$ywWb% zl*jozG;H)%o3c{PCK;U*iITG+5ig?8a^BkHY}veJ^X4sTbFjsc-e$EW-W+c+Hb=O! zZ$ck!v8YTg3g(vfGPXo8rV=teP!PoED|q{89ETVi=<^y95pGpPV02he5(1t+jIK6k zwn#TeBW*)zNpd0*tzw-;1VOf>dQel}ffE0=kDuq+2DbNWbeI^klX_mb;`(R0v zgfcY0@#ZVY2*q*<5rR{PF@chz6Dh?$3}hN5jGi9GS7OhUL!CWmTwvHe#LJ#8T8Hro0*IHg{ zQLhCp#%qO^t6pnqd5sMRPdKaBY#Au@@-T{8;@2$dRLiKuGO>+XGDM>JYtX9KN-#BA zl!So5qFp2qgsC3pO>1hH1+PBFaZC7Gj#xZ=jjfDvM$ci?E`liNJ#xhiC!DY$(0V zl%rvS7IfJ4C3hh#0uFcsYfyzrO-jK1avbQR*T&F75+nu=&P166^;(ABWoDQZ3D8CA zNtR(kUJI-v6gpBP3EXRaz>ASH-N+HAuY|GDQru>2KZmB!*bmWq(9TH9Y}@`OI)}EI z+qa3yzHP5!9H5m%MweilwSC(*c+mIAws^a>4b}tb^ogAYJ&%52+fke&v^T|@y$fh( zw!NM7=;2FKZQ)L%&EGkqZD;w2+N!0G)6TZGV5h~a+8MTGc4Cwj>CT-|+h|&G#1BqU zTf8&Vwo}2jN;H&4aEaSu`j&RulptW-mJ=5Y6t(byK9VF7z;LG{#xOA8VPa5#Sq$?6 zaS++Z*cKc^U`z=YG2b=_=#P&Q-)Lt}4|gUYgjETULY8m_U?f1ug=s~sRgQcDwo?jZ zoiQv3pc^Z?5~lKzI1C*Dfw`b#pvAf(jUDd1O6;T%2H_{#c?HcYC;{Nfo<)OD*QKe@ zsnL{)1}qVET_rI3#50;Ia|G6ytITDTP{JalMBpctDLsP{jNl&{N{4Vm*)gSrt`IRI zG}UhGR_)gA_V(SS_9|X>x8o?a$7mH*h_0xiqF(Lpha^G^U>LWXa13{kfF}89Wh4r< zJFBI;!}gq@;}o@LlVEwE6d5`>BA`b=wJ6X7TT~&0nRb9kwoEC6X)FnhskqY%A6*v< zP?bKx6jK7MV3flkcL3{pS*Ui4+F4*;=gbP!ZdmVulBn5J3{p5o!<~ zWh1}#A>tqdEQCWTGewTd85Nm>c2kJOv`9vPtKSY}Ds^F(+B2LT0#bxQ+&(IaSV7S6 zq^?4n*u##nv6M#+be~N7?E@Xg8yBTz-{_Fz2u8hVgB^W17tp#oOlaCV`q6Je+tZPG zqvHZP$3(HEqu61+(b4gS57DC(br6x(G&+wKb(o#|I@La-GuZc@&VBpJ9|)x%?2DmQ zofgN@J{m_bj`rEK>@1=0Qwoy^E#7CrqBGp*2oPLj07sPWgP~l)p9{oD3Qi1_r6n*p zGSOpdQ3AIwL;w!Qz(CBB3q(~Eh^LXHE9qo9_eIE30w-w@u?Td3--rr`BpOQsOgQe$ zFay+xL)VLfXsy#3*q778P6Wx)2uBD@^5X+PDCYwg`qM2$^Cg5}k-Ql7NUS7(0VUl@ zsu8p{i$W2)a!qv}@(QUaQ3+M~BuJ+po ztz?$X16^I=fw0Rs5Ot{o2Ab1#fQN!eb=goK=!y>5T?a&#;b0U*Vx&*efw(I^V9_Ev zkfA5MV4)6FC58vk7exf6LuX1D>?&=cfy#=wD>#s)NI(?K;w~Tg#kjJs&}UF26ADT> zPbvkTNkB`77~Mb*sU9jNK42n-2B2ApX26vF3I}CzF;V%rMiP^0&^)Ot#1IsaOxDE` z5)DX@QdlyvMa;~QDUT4aH6*;RCnHIy z%$CJqq>bi!+6kOwsgq_LmP#{DqRyGdGJ#=v@_gP9$PO$Ya@8TrJ#@$o4=Fc36rp8Y zbfZHtM6qi~U&%Fh$UWrZbI6BNh-TAKOk!6e2mopg09*lU{h=!X<3rg*#1IA| zMz9PHIRs`lhU-H?B|(EjVZEU|tH=^oWO&ryzjB(wUa=IgQoGoyG7%GcqbkU}{Ks>}ItR?$vY` z+e0oRB(;B|4t` zBRN{)kQ8VZYvlL{td3H}U=)Wyp$q~v6Xy^?{Ua77lGTw&GG###`eBkO!s4Kmr4^-y z1YG3ms6|vd$43ijsGhdJE`AbD65$DUq#&tUM;b~XDS`xPR!JRmuh^@j1^~#D*l0?H zd5nW{=|DVslqI}Z3?(e9#32fnoj{TUoraFeXz|gJiHoEhX^J?<0Wb~CqCiO{#Ep)O zU`&Z2cqQPL;33rLGC)gFqGgVs2#=d5%I6Em;}g+w>%{TnxELptr~>K5C-TXN=2{cM z+&q5b#DG|2P8=UZhvvOd#Av=K3;`R!SjP$&;RG;@6NTed=;FZGCq85$S`n>;MjHY$ zoANcE^h*GwoLK~t8%Jd?|2S&nfN)gwCRZ(sPuLPQI-X^4d_rA!L6G{zkqNVe!trXI zBP}6Qm3%Z0%rZLe2#};+JU)U0Ef}gHhLXgfW&+{F#I(1rnQ@t5K@iJ2)or{PpcRuA zc3W?DcfWZl8Mflu-93^b9P*(@A6jp>2^oElcb8;ryxD{6AR4c%zMSJk zXS|um_^99ir*c%V1rYmi8iI&qRKVGjo^i7Olm#Sh0^InNO<1gF#Srx_fEtb^@q=b)? zXv2d@A4m=pJ%vsJd+KB!G0XV{QVeN{VZs!{lR6k#iQ!a8N*yfcRN*ax#TBGbM<~;S zj5r;JTv0ipaS2XknFk|CDkP5ebHd`27C{t4=u~M_o=g#+gjsajI1`<=&YV7TCOjRX zYn&;G$b?9t7s^Oq)#><5jIobvhH4m{R=OLX37`oGbs7dlHO>@ZNHKx(r$6atMc~xw%$d{S>1sis{4|nf4gug|nAk*@hB3tcRzyoxD- zM-nvoz|asYqbEw@6636|9T=9`6(zGQ(Qz=(sHddE(_}PDVM}0jA+{I?J#^zI>d_Kv zHN*(95HG(XG|mXAKcE#UWl%0@Dx;5MVfbLj0Z#RftZ=m<7XDPh8kDDoMT~1T3Nz&=^%G zY{0cL*?LAbMZ6<)iA*4b!+qzA=Z$lDvc0_VNwgWmXJA6n3BTvTWw+Sy*`VlR%11q||NUav)gy6E?s7khh45UJh~ z6v^iz1rZvZdG&j9iSl9(Jp`RVKH4B!EP&E22R*Mv9ID=If?Ng+sq95A1S`TM&;sh2 zdD)JtVy{hGNoqjG+D2&?id2$RjBJ&Zod*RLYi9gQqGnOdxtt(#XX`;@4GQKgS4UF- z(23D2zF18#IeKA3*1}6hpSl$HMVFkuOPBgCp%eG{m!iHtQ5Z5-m$J}64UNTX0ZO*w zB@+sTUX-*l9%aP!lNMjH3DHM=AUb*mmvSNnBmw+Ossg42+86UO_)s2%2_etC>P7H{2 zWlTTtjQ)~m^?UvO5xNSk;F%aw5qWmM2Tk6K`*XN@92GE#(L%J6n9?cm9AbE0#!IB3 zr(gqQFG0?-i;toydVtjdiwU9u4`PLAl=YYMiUEHmeG&wXQ_fdsnv|eZuPPe~)?gAR z@-qDhG03WLL^?S}RFZ)}l+Z;DzDUJBmLii<3Kgsv0AztQNtHVFSW1XIR4YkTcq1aM zm6uDhs}#%dx-or)94$I4AZr1=BCsx?VnT<6MnxkS$3hpNNDN8Qm6Z_!XvlC@(+Do9 zDJHg^1IA#87NIo{?8n(h3ld3wARa6Xn1cf%$tTi*fkWsGpwae~feSdFMe9YQ&0A>1 z92hu(^QmM+iHAm+8u%&BrGaQL&WA~hag7H@JogKR00B&Ft)A$cwdYZc}~QbAhD6oTU5CxMfZf>vt6h{fy7z`Kr0 zVr4cIFPg~^U?`sTiZrpIQjr1r`cQGAbwFfhVn99TOOHxK^z(kgA9M-dvMX6TYw#<(JJCe7@q2+%H}5r+NVf=&1Q zMf6p{BF11LC^$NoK1k^qAW&R*j~2?goG-P00XJ}xeL_k^SQK!+a4vy}0Ko)wc|s_M zo*>70qj0)tluBq3+S=mLqFE}+_zcEp(fp(h6#LPm6(w(@^`RXr#-&TR7SQsEjQT@p zz0$g1aRI&KXai^(AyX<+NI`&h60KN_N`|k{`q09pAC+Q1Kr5nAS1MU(5XpsBAvC;3 zr7FKf9X?UXmY(4cLOW2pB9TLhgP4xk`F;{6kgEx0K7q8#mPH8iC8|pBD_}H$YlcIn z!}JUh2V#_GX1)kDRK|x*j8-hCo~40gsR3A5D9%dG0~q_I93#?6`-a_UzBeIML&jQ z1f^_#pddhRu zn5pS>q{P6_NdSShB>}0F1<_EjbkQuF7$FMPmRiD+6_UbK0-vKu^Q!BKghVh3SGZLY zBNv)pf-3R_2|r4g6loEwhlr`f!6?a4P85@%pgb4UYXNSO%2aA;GMy|yNfz||H727A zmADcfrx>LeA&Lp3zz%~T3{(hN=%Z1}mI=ZlE^%On0nFG7#i$6Q0Ih@;RU9bG5GR6} z3M@EQ42TE^D$&FoGZs2XfCs!sz>WFf6fuQTP$fE?!h$3bhelvx>4jL-vSn}pCjMxZI7 zB1Yh(ONQexM{9i0#Z>8hLR@4Pa3#&cJsI{jjjSQ*(oZMMa-%RWBn$?0Dmw?k7>Pj+ zlMhu`TM|+wyvYnPik=M2LI{4s2-%|t!<0vO~ zQ0WAWs0e6~j>cqEB?4i!1c*QiN6Uph`M}hO1}o+;ViByEXjR$>j=o3|k^qS8Sdj^p zP{DLjny!Taxy@|?e zKIxZ$#xXO{c!1C@`gEkxBiJ+cNV@`hA% zqM2X_2MubbJqSnKDi{e#mEX&7OcMPPOY601R6{n!#6x`R;C)lg^9yrkc+4Fr*pu}u)*DmY{{ zAe=xqW|VRb;XzL*HXjX!5}&?0y8zOB(ioUyT9@KXj8i48kP+ccWW~DBFQI=FjTNw( z0J0cYU9V;Ucd%%{oUoA;Qi4BCnXCyn#Uhv$e$X&A2FWNq5t6|miG2wwS`}kQ8xxvI zMDcx<e$l+eyw?1b`G@A8n!j(p*SrGAW6UaCEyNjZ ze#m~m{So_G`#Sso*q^cg-JWaTV_$9mPy4UzzqJ3<{-pf}_U-n~_8R*s`+(hJpSO#4 zWarU;(4J%8Z-3MNH~VXLoqebME&DFW9pe=D0 zI_sS$!Qo`*%g*0A|I7I}j^A*8(;4afPv@h~`*D20`GoT)ko~Fi>(1{v|Bv%qPL*?| zbG0+d`4G;3?EIDUXJY#vr^@#1^G?<-IyvVm*!-3qI`4(umCgs9_uG%!%j_T6OYG%1 zFS8$)^SAAJsCBk|ulF|5!d`7ZZEv&}iR};URrWf&$=+oD$oV_O`D^EIkmn(1 z07tjuIlWGgGu8PDs=vj#!5NR*W;u0EhqKS=bWS-ZolCeUmpTia<&dv*8l8jA9;YvR zrQ>BklD!Jt<#7EtEKfNXohWN&-;@1=?4<19Wbeq%%YHZeQ1JviD@~%|3#5PxhPHMcH-PmD$&`hj4xbqwi$vvJYmDXAft8 zn%$YToxI~ZC172j{o8C!_PXpJW`95X(QGz58oiC#$8#Uf{dUgI-IJS^`&90R+)Nw~ z!}mu(d?vdId92N@KrR=u7jl1+`)KZcxsT+2BR3}d^=xhShV0*ECuBd3yl>A=%ziC< zAM)OqeIeV0Or~c)kGtdp+5eHvIB#c1IKC5uxjcC3aZccTz6{10M{&IDJm+k1o^pQZEOXZ2p4yJ~BIe?wxC4G0_r}MZ&pQ*H zFJU&mgI(ZTI399VWUHNv*;}%o!udPMemUBX?CR`d;7oTWIsb$i`&Z`$=bUpQ`?>62 zfJx}U`!^hwHJrCFUkjW+!|YGC_dEAGUvoAipQoJHk#Rk;y~DW``99}7j(hk!xR;ls zzsufgKWD$@tU?~QU`711^S^O?8ngfJPLuPKtc7_lIj5a<@cBND?>Tp)HwkzCAK-rd zHRl@p0Pfxa$F>LUuh{one{213>l@Y_>@)kVPV0cxV(qhDw4Spbw|~zzan~-ezk_x9 zAkK}rPuF2B|Ec{ctnB}Vb-f7p`$8~u8a(gD@fPmNgUIVvXCf;4f<3|hB90s3I~OZq zA+Y8EajyM2tcV7zhvoK4`;e@o8L0hBVD|&g2O(VwO9y@q4J+Go$ip0n7o?0)BeVBP(N^AA`(*MqO00COGglP%!uv$7gLg$NTQyMMzy zFah{q0`n8FBQL`o?RR>z@5Q?L^Xw=`Ifd-UvsQLi_I|9Fd$a4ad$N7mQ`!C5-B=+< z(CfosGWXfsmveXJX62UVew2GE_fl?g?gP2s%EmbVTJFztf0p};+?3oGav#h! z<{r;Io12&W-P|AL{wRAB?xY>aaxV6>+njmMY}^=w0^7jZ zw=P*{tv|B<1ZW?&uCjg~S>9(oV9qhWXFg^wHJ6yH&8N-9=0oN^=KYX<1J|#~cj9dG zL3|@Nn#;^C#N1<<)(ErT+=6fC4fvLvX5MCg#hhSH#Bsej4&Q@3t~akUzku`S&3~xA zRQQ}4RjI6GH9lhPv598Qby{&o!+Rv)HtM^u~f$j6v zKdHXC`swPeBQw?et6O22uiiQ0nGrv`6la1Rk2Gy=%IpYs#_#@o@_M}Og^SR^Htc+) zwW~GL85Y?8Y3mD>{;}4FEB*Uh&s6$9Zf&Xb+gl$?`oRvb>At2CqYBc}*3OF6me%Jh z{S&S8*)PUJIhbzqTi^G#c;;Kp?k~^S?B3q>efOYic5Ux2#2hud8-|UJyWbr)dcZw9 zY_!Jx*|5>;?&IYVGU)g2^L)ucqyE6%U)CbVOYZt%qc`1$Wi(VpUu*`=osW2%J+rep zX!|9+!#do#=MlHdHTUccOEUVY`@*o%F-8!b5oUJox!*lAO!;HCW!R|QeXKk}3LeTR zNfH`%soPoBBIFkL`C+3I?)+p_o(v@RR&%eE(cApiFE1n0vwg99z|Cy$DaGh-0!!uo zQGiR|=rOi`%ROCDJmtPt>F;)bsQV0?q>jJ>w#406vD@sftMre%4Z1&+bY^S&Vz1fD zv~T^zDHmTDG54nFkH7H3qFZlzu=s-2F!dWxzAdYuFV3{TA!WSLj>zqANEu0A%3$AU zH{Osk5`~nJ^rZ~xZ*A|x1QeNyKuHmal@yWmr3m(4kAHDu9%iHI94j-=HNCa#7v5B* z7e+2w(7$2k3oqQd{oJ>H?7v|D_~EynU81Y=Ffpx*a5HCGdjj@f#63{%A0d~C{66>X zN`JNcYNfx+U7`C-Mpwsl1nc|m-ilqb`&^}e%>54gKFa%L$+fgE@_q`wcKk>6{m!EA zoI7&Isf@Q;MQH-jJf- z=tQC&Z%ENeUy4rpQgqUnqLaQ9E&Z1EOPJ9DGZZ8#IkA$GlfIPvMyD?MSIxISHZL^2 zO(H<@g&;OAoIY%v>-`UA{C5{U?4Ee?8`EDtc4E%=&Z*+6e>`*`{7L5{59|KkQtA1x z%-H3tH|Kt@D3l;XU+Y0~Vs^FmMKU5QL!*N096x*R+}We&aaRn9Nzu@VBn^#FMPHqQdNKckgpgRjgLIuT=Ua zH*@$Bwwa5EkGabe>5gp|!FitbNt{3!-}5d$?e4R~rCr}BjmvzatIvIi(qY`3`!8`| zfCFPUV0If9;(^%AH@#K#jERwFPMp5_2}}TP^gPN_yAPjnGY3xm$20Ko@%e9k@0kM) zC+@j(hZpwDa97Q~v9sY0_W%9RlT+vJpLuk{t!?fD2;nPVOPrFUI(_sN$A*7xzRZ*M#L)VvdSztsKR?;iiUyXspvc0RNv>3?Hx zXWj9kId8|R%fyc!iF26jIL7Hbb3VMIAQNuQdHtcM^KPc0=`DOO)hjns-x|7^j`4wO zG(9f`{_?Fb={TM*WBg0OFvulu56t;QQ_>O$9;hM)`G&KWf` zI$d||`0;B)x4QX;ni(BB1?4&&3maS)xf!#O?ZWz!J4&PMMy@Y>Yxa|oYaeL-+3o{p z+?>wU#V!#yVozAO>Vj)GjIXI}F1q%@Rc=EQ=x!cAm)=3FniUcn(+Ald~d+}n_ zYhCC))8l)_3T0%jYdP;_CbtaoW(j%f_A+xOhn~IitKR8pB`d#*9 zIy2-nYWBFP%@0nv@y5?Ccya2u*`C|)W~Q~lZ(19uZ>{$U1n0JChuqA|UD%6v9F|2^ zzK_rA@1tMwel;?&f%_H9D~@qG9}jYuJggU)J<-D|D|qn=%j>?b;w8>0`0Ye7R@NokzD#=LXx3%{7S4N8?8i#}1YnKg_<^ z+NqbDJ;%j*E0FKdb=I!JExxMPbrv?eZb#ikcl5$0ci}R3U9HlU=E26u z%``q(be+!D;?E(yr}N9}UH9p>&0pU2Bm%Zu~r9qz&QcgDlrhF`qhZyi^7cX{kM4(r(Qx4M1Yb+Ko*eDay&!xpJI z=eoVPvA*)vbG*eAws+oR4(>5bmhZ;#sNn3O?JYancJFL`%6+{pnI@uILQfNzB^{qxN-Nnd-u8S-b3zvv4P(k3W4(0X_>Pi0CN3Rq+jiQI3Vl5%Pwd=#aQKQeYPzu?-&xvanPMeQd*@2T z(rSBo;9dNzZ;Tt)jAw<7c8h@_YGJz5Iqn&+Irp{3gG^FVtW8 zW=<9$Zsy&Nv%4qG^PSuwuD=pmdHsFRyKcqRTY9D&SJ!(U9#y-?8e{i*J=3o?TJU%h zc{!-BdB)rD^~n3J!`FF-uY2<9>9Cm(<7cijCil?iy2D=gWaDb<@Rm8AGVoY~@7ilN zzyS&>0kOz1a^A|n{;LMh>v{IOPoDFR?>})7`{m+^i}A^O=Aq_5;aRww-_Cn_e(|y{ zzVPt}r+@o<)9aQzIDO`<2{%l*xo+CrCzs5eUG6_Vf9CvoH+}ANH+_%qKK!`w=&{Q8 zb7f(Ji*V;Yu52tatn6&Vs@j@`ZlkI((B9)VtesX<*Xgdk0YW|puWMB9m}yvPbH~;+ zV~KUv)r`l}kiBdj_Gabg>YEzyh1iP6B4=9Dl$r+j*W781pV_p3(U#&>Pso%k-@cP{^7r86EGfBNCyw7c_Z>Xv5Bo3a_r!8p&88u@UVu#^V&96^rYix8~ zH0WtEyXJ;wcN+L?h+M0-bzObrzJFRxO=DAi-L#HLHP>&#P5-U0HE#RvlE(e**2_QZ zIP}iA+*tm9i29*l81>zPmR!3ShkmgT8%5v!K*QSF@y(56r?i2_;RMXB89jC(evimq z<1QIrvlgqop~-iDqv?j4+O1$+U)GKvyS4_mi0eLoM{;;kBhuN#`4+labvpY&A-NY#=CCIwZQAIeuJcODAE*ij|-)S=G6{q1!qv~Hc-I@j%}<&VN-Z6r4Ve@Bd% z);P9F&$z1j&7{YPcGuldGuL&et-WC^9(tQ5)zsm45$}w^z2ZRQ{rB&3Tb^CN4GZL* zbAS0Xd`#Bi&|H++)g)tn8`_Y;4OlVnai=xiFr~GjW}4inGC!evWhGa=qU8tE%dhwU z+|shXH10Foux)Su%(yT4ZkA!2YHI$ZrVV%Oc&s1%T3zVkTVTdox3#urZhaF6*c|wq zHJNDH8Tk9?W3adZx6Q(uC9OA%U0b;&I_kfCcaysr_r3e_p6%_!mz%k7CmvWUo8Se! z3;$I&I|G~DyKMY!bMNqt|AXG)Phwlfom9KR^S=H_vWf4#4*f_T$a1*N4qx3}+4euN z*PA}JyZh>HZw~kTvd7qGJkRm4?R!Sxy{CHuzB;(!%cc+EmO1z#yS&X?x<`5TiQ}Hv zD|g()#e<&N+w9^yuE1aH=HdN_`fe{A`SOE*n|s%vSot{9y?wBow`f*@@*HBa-w>8?;V@0W%-6!G$G z6keR&eZ#l!{--ax?um2f@I=-&jXO79gmlcPZS`HJwT?TsY~H-Jni{aWI=JX?_wkzs zj}pM|oWwUGwXR#+h7q&Q@jb}CB}-n%BjUb;c<8Jo8p$Kw)o#=HR<~ZZ=h=;TYHW0I z0U7Y0hW-1!(=Ok?XK%$1KINL7(>jy=8*CvXphU=Wn!9uM8_0%_gfa5DEaIEkxc{%k z!}rbQ(eP3yjKff=IGk!O#omowd!f5^e51Q$q3qhj>mG@UUAa%%+NOE#M`wUz>>qA3 zet2&k-#P5kDBE`PgRc7&9-6bSuEFf?#}{@&thx57UToT(`#Se`?(2=i-mcELGqbN# z@7g1-JKXYh?7b@vUl(~Jxy~kR;F=iw3|7hBYq7F6czdtu!H)gRBUpc1B5%x`dT-Y? zE4=yj6%qFAN1pWdee;;!v*#c7_V34@jc29B6DJz7gq~VkbS-swcT|e4=;#R_yET3f zbl}ciyOvuM<|$bP$((by{y1-JnP0quEBAPJ;32_X*2w$5b*$SuiO)A;hTHV<^}cKE z>~y<^-&sG;yn)5`;UV^i(Ft;yP}|rhcNu|%3j?i{Q&k2;ZL?;W5l!dwaRn$PQaeKH#9QdCqmh99Ru6uoGpR(8}gLx zc`L9p-Px+ds4U_>Uvc-qW(@`1xeB#Y^eV zX6&`m(H-1tJI?)Q_F8rM%VU(Yb5D8CE4c6HeuP%pYcXt{;m)pa!}{b4WxF2hWdgPe z?6l2O)}pfxzm2(ry|7Q^n@_>)Q7qj>jq*;d>9W4+amokJ>7U@8_RgQW z?g4B2&fUXSUh|K+!~W`F90`NhXFngOO5(gT%w-FFk=|M{(bzQjG%O!oXD41ljN%PI z>d>Yv=?L*|9}i}%xf%00&DFm+nv+Z8TKtBQEq2*oe)@C&{5Zb)Uft&I89wPhc&X^c z9r2!A#~ZzI>D0asV~^_4`>T0v&m)m>)g15I`Q5Src=vOCgkE<3wbvMU7RE~XdJC4) z^awvlBd?n4$dFZ%NU*(jkM-tlPqx=po_B8NuN(M{8J9CB>pOgtEaSvSEsFsyJ}Q3qCqwye9fYA1Db5x%1?i8nfpzA zxpZva+`M=A-pU(z*teQce{GOfM zYAbuz@U2!|{)Ynm1Esf`dWZH}zEHHWD{`aF?ycoUTZ>n<-Pa~N?F8(Wzi6kWHSVOA z>6M)pH{pu+RW@4ex46|#-f-~zPd0Zw1Jpfd@y8kc7K0D9O>beN?ca^Rr(_Oy{b%-B z1AjCa{&!jYYq6fzfyzVe2S^v%Wg9IX^|sb6jNB3WF9`T6!j#Az$?5NGya6}KTx^ab z$MTJ22RE*D3;9$F`MQPJXWNo}_D7v7G4btqq)FaM4C2qFPs`g*{Z1rv*H5sG(x`PR z_OCB@>TS02LPFc)Z^CDxz5DZc@H~4Cr#d`h7&WkM4BRWHAc;1WKP%#IWtJ1KX>$tWoc>*qbw} z@Pu(?Yi*e{(AUt^$(_4#t>=#BCX4%U;j#|*)9z!qjb)QBdgV9X2~%cGwm?2oKv{F~r`Ar`j)g@7P<1 zUN>N=^elf3Md!Va(+Wka!9&|3{ES+)w!U*AHq})A zP2IgMA;#a-a7Wg- zv+)BfJFNjbY4cp=esHclB5|P)&894K{&F1Cv1CdoIUrNXrdqEz)z{YPO|@(I+m!*= zYVC>fUuBCLzO5SgW6kh?6dd;lBYp2|b zIs8>qd1rw4Q7e*%SiHZQE*|jzZjPA$otJ_@KpSD=pONQU5zJMy}@q(iuZQ? zW^X|!UL_yfcd0P+7a;suw|y)2*zoW!Jj@<_y|4e5yf`RfgB|+kN2sa&jiK%J*GL>% zBmOx8Tf=NRAVj>k>WD1W?Ni(WmJL8c84nIr2^&qDk`7henf zTAzY-!app}XhscuePE1dF}1*|!|pdmKYNHxdA^O`3gA1J9NGI;xEikf7*R@_C74_ zog3V)pITk+KKwoN@`}0r{#QdP7aQU)3|b{Y-z}#6&8O>*e?1t*&WY($JK|oxP>|*I z&aIelP)2}vS$z#nAhmh+fcxQT%Q{``((>cCa>4IXcbR@F`f>**uL-f6-TiMI8dfv@ zCikOe{>#c;QJb@C`_5f$JFT5qg5ql`-J9Y|Ww|;)W;&alznD6me;yAS$~o#ZGtE z`9G(sx@i=RbMO6ses@WX_Eue8bbG1%P6Krb@$taG>SWuL-6c@~daNG}xYjvl4+evs#W=PxU{zzeil z-yzhglf>CS?BVikW|9q^$zy|=RF0ikg&iPCb$KQehEM5F(9aaV_slxN-cE_gY+!%7 zQgI)JN@Af6Tzf-qEfl)t42^Hoylv))cP#B@{5?B&Hvcy?=~Ft@@+qB9 zf<33f!$XJdkkX%#E%Qh_Z+Krapos@G~ zclqMgzQPHFlx3OcXqgTTdOLMb9a}QpAzAmM+jNKRx+`we{}c^m4@R35*;FDSe62?} zsHXlNN@@^mNblCyLFo&ZPRFn6rdvYvNdvgqn1{2?38WenLk`EA5Uk_Ki)PTR!8lG8dCYm@uR3Pe;mxrK1YR_4IahJ zuA=!~b3VfK7L{lA^(U50{u3BG#0zOh}kH7_Ji=rkbsYlX_tZ8{13Q~7!`}vX+o8$&lTw2Dd$}}>4ht_ zdCje*MXO*X*Zo{9P!kGSs!_7{hkA4C(ghj~Z30DqUGwsqr$Vj-*#_RDl$sU8Uvm=k%B$9mE;+ zdV`TOklXx@X`>Ff5RO`1sb8T)V*Py8L)d#fH2H-+8zj zZ=TWZ6rK*LyQiazYIJp2)1lN!4<6QC*IB_vmlo#eD(E)X#Ftle`Sc}RPj2>R&LGmxQ= zJ_>8mp*mbK9i`?7^!UBQhAv#QIBVKIy|fm&GL+rNN-J|ak(lJ_PG7}Zney{o$7Adl zU+X?~HB@&Iy`6a_4~;+{VXjri2If{HZ2-Iuz=_kxbeu7LG_N9Rs^nJ@U5+nnqict_ zR*ogD61Fu6=PWIYzbq^tI``n0&gn8tZ^bSvf$Fc>-mDA4s*+O-D#k4iJ(WK*tYp~0 z?iCj!^yq%5KQ23Q>gLa!7nTxi&|N@3e4nS=K_7mizmW5NfbJH3NY@>v5B##R{pqz> zg44`O()VxDouzN*>(c4NEnT3FInAJWT-x`u^q5dNidtNHP-4w?dt+UL)AbMFWr^LbUn7KI=!AsV9xPF=ny>IqNrfX`;9`oDS5{p~u zk4ukdUpq{3z$4$>$0gaQ2KveOI0*V!iKC#) zZWS;ZLdl3mJ-LpzqJzw z!#|Uh2NlHmWmtCo zs6W_lf4Vw8z~WCryd>$zYP9`*R`O#~ocM_}K7GHE?gk(HU;2~AO7EZ9UAZ&hk$-A- zN{a4pXaAWE&m8Tkd<-MCMB09`h~MQCZz{md>}S!s=@XAMhk zFf9%2(3*5lM@P?XH7pyA%Cwzb#HKyl+tJZGyZuosb7(+}-#AVWvx~KBxmS6sY)p$Cttw9B4>5Ue&+TkU7 zN7<6Y(T?=Qy2+5^OB};@?Fx5Xa{N(c&El!KiKkYdstFGdkOv0J1H!{Ksr3l6kKW== zNKO`UC#{Q4o;Y#yXgw=UcT8_(AOGW>#HxAiYp<SsCNrQYuJR#?T=IB_~A#hN?$xj{-7$BD`@Q>dnG?v{_T@x1P6*Ut=|CXb% zILB7@=MT4&SbNN=teoS~POP$Cw|zaIGJ>Pd3d8DMO$~xH^_0(gbah6$+JBam0zb;a{&)gG;tD4_KPh4NxfWoc>>~gFZ`={P<*8u%fJg=J!y9PVao+G49uCGB3Y)DR?>1FAF zJW);QCAO7UuVy;p-9O@4uTqVV4&zvUB#l`r0 z1M>NEhuujSTdexD#S*CnXN8POpW_l1Cv)x&c&7h}v&6b>zH@Gior9Ix zYaPq5jx^dJ8jr*)9CL=@-aW)RLj_e?Mws6$gsOC{7{#dYlEJ@(*R$d|%mRoQeT!~T zGKZPeoWU`&j5{hlCX--aMAd-tm!{%e21Kqjo_{IPR6M%>3`mW8869PT?d^d^M~N4% zSi<*UL!y6VV@QYh~oj`E%#aw2(7rSaSXNH7ufk{JCL?!*snZ^9H&l z%+H8^uxkF=_Vp7S83gT{*L-FHM}~)Gky_jQ30WlTHCwkXEZBk^+GK^rPk1e#oZ)OG zVOgB5eHO93G|zV4bwcp)dNWR!5Pc9NkK~Od^NL|_XrdeqZN8FGXsjuH&wxka94u)r znL|k8IA(eY+6av!WopoJ(u^7gpwq1xwC0>^wDCrb!tO^EPiH1on44M^w~$%brD7(P z7|FBRQeJoCP7;!Jj_ePThc=TKPCmSWG{?#1M@YsItvsllBi69}ic$@Zpd_w~yg;>D z{7y}bT&|^pP#!7|y+a6h5^I9lIm&1u3Z^#q$Wc1NST`kHg8xDXB5nPEt}~l=P(}=Gvo4 z)e~8}mt!^_b~$>r_llS%`Dq&bBaMkmH?=4gi6%_XlJni>JbEh;Eiq>bAuEb2@ULb{2`NGdr>~0=J|vN%^TH4G@jT|qLGX)oL)n&m6)4YHNBZEm|jdW0Q)O#02)f(rh=k} zHjpem?{qT&Y*$bTX*)?WR5j!Xj&WF5XgLg`1|GSTAXFL)b?p0MoBSHlYvHctae7iB z*OQZaIRi>%6`Gu4Jjfdw@TROmPKZ%%lR=8HX@v$IT%3bWrT)EnU`GFo`f}})U|PHo z>0Q~B3hLtQR2c%FXz;=XqG$2k>-ta+>A^_oMRmDpboHk zSCFDHEt6c`cI}#PP*yVyRmxaGSWLa*Z$ioC6d`03seI^6D3$F*R=MEAW+^$d6wRs4 zA`>v_$-`#Ft0oj?0j}B5Wh*c#$@0TyA71KXQes<)cNUx>6Y_Cxad$W}p`3QnO!U&S z3Nnt6nH6MSP9jki_dPR`!4%k0&G;YR*5K0&j#%=@yD6puZ$f&p9jTayNo>vA zlapY{8X*a<5LPkQOk#;&(?U!{2(23cAyrC#(;Rv%d^jyHsU1)y|8sq2RkPO7v!=gG z$2H(;*5fiQyjXgLi((n>C5Rx2GA^zDvl^;G;cRnH@r0_ma zEWG;T<&qySCnQ`hO}Mn{B2W~Ddeomk?!+jRh?24vNJy5!R=Tm)7S4u>pNU5}dt}nZ z5siSJSs*30wQ&4?XGrbWuVvwTHB>05y}dA{Cb2jpqhtj{Frz|MGmlJx%$c4Ui4C-} z&=V-ZSka6F(^vzS?pa)8V3;Y`EmMPkXqyg0n^G2wRRW8@(xAQD(y-!{N%O9`2!^<>* z0qPBYiZF#dP*aAfmBOpsm7!%x7cV9zmgMY7E*3@xk2@ie!&+M@IpKj+beC;24weVe zgNBo^n-43I=@3TN4{-=llzeyzz%(zwq7`0uByE7@1x?<(u8L)eRIZjK7Lqx|%PgK5 zh|R*16(yvLfh>~55j|1v>~5@&h}x5@C~C%`}k`b zQktW!AbHy6E|VtadFJ34L-_ZA7PPYVd}_X|+?BA=61-@-B{jfF!`B%j-R_UzvM$v>RB#{T@7 zQ3R1gh(``V>xT7O6Y>qjE{qQvn{6+VOBm2l4yA}Ak-ad1I0U}97EvR)^dUz^+WO(k z^GGdXOSgS@0FR0)elda(o8oy;!}+MrSMx=7-JJdW6i&xj3K21E;2%t2_VqA}yR z8j?4snP>oG$xQ5cN)D-*PGR&E!f#K{E+ZL-FXiwtqp5ZKA(>NZBrl$fK`J8#-^|)i z^cfIFJdy^v5HgyjaeoG4onmcVJNcFQ3k^XuRK%IkaZR4aJfwjEP#%XuGTT&$L)$Wh z*dG|Gw3wHZ#88Q8Ko%wOqan|$pmtWfaNPjG_b(0e)<)xKx@S{TmC{`x#y+XaAc zBOPgz{MRPL^I;?$8s2$5%M?Y1abzqwB^zzS2w7^okJ#>e-F9g+>H6CCwT-YtLWKm; z6^5sy3SoxxP(z>st|bhdu#NbPNC7Em9)-@g(v0JW)_+`q@iQ1DXg5+aiCF_|kQUR>PvGqGa&+|C_1Fm<_}$~@kRv>IoVG;=Yum~;{17RZNB+>jwxXqVDJeQs z^zd^VkNGu=7Qkf<+kk;2r`o7mQSEYV%Im^R}(>nwrKDP~rvgx(qW=;&-CJRIE>4hdGf zR8soAVQG`a4yi^B{O8H1Dx2x~R-Fx7T65}@H@CFlzi@t&-}R={mZdFQzrXoky=%i# z>zi9^mU^RI=rKR(4DXX{Cp5|Rnx&_zYIX>_mp;LibkP$}UKbTL!?X(6RMY@I$t?Sm zZ3q3J&Q@LUf2vgB|9x3T4{MCI(R?y~h;-O*mKb9@Fmi8gYh_zoTAG`hn;Khc8#-9R zNr}-&*S8_M=UUl8_YOn`MQ*#%!uBv$gXetx!BZTA%X@NdtbW3fmnXck9(5?!->300{`n-J&UWmNV^$EB7ALczb+4BnW8T9JO6DDuY>JsWLhrp|6aqz z`RS|U{J#~bYoo7<_brO>BsXw{deQ1za7H6(uHcOL!?&^>Basdt^Ra(H;&)S?k)pZj_gndkWuIYh@JDyR+|U86 z(C~zRKLRsn|J%=xX@v7`ynqmaKGHrEo*fq-X+H|@6p4>~UutYZe+7L1-Ps;(wO1FRL(z$~&ZCF_Ew`vR?Jiy*w(#tpESY}~C6K`p$RLfe zaq`Y6FRzNS?OhC(z3)C_2pKnBMNf^#did&ZAgVQDFK? zH#<0iVaDcS(NRIGnJiq=J$)9ItEtoVDEo7$5%@2n>O_FsOt81if!Ui<|Yz-{!qfM7^VgRu+b((dlBV+G` zWrg@U3Q!%&`G4wY|J0iq|D|vL_x5c!`&|7DSXXvA|8O1#tU%XSx#J3})ZzqCFd$@* z^RP5p`W8kixT;F-tOqQXBn)Cp$3AGW(pig&a8>;CYCvjfvgY><)Nob9|BYc@IH*#^ zYSb62)oK{nl1Y<)^U9=GCQW*E;wzJ0o3s#b8HmR#^XB-3rT1{n9$rQx)c6KBS#ltV zn`}M**zC!ZceJxM|62V=Mh3cVKKicU$cgQH5kj=WkJ~o0XaD%+9hN=)>PxU+tM}_p z?c2v?ar?+AX`S^@TvWDxh80@myoR@59I~RIhBsc4V8hnW$4BK*Gz4dywVqs#Cp~7z zBC+v_Tpb$fp^RR$UiB+W$0A(9yqg`~zp;6<#p+3FySOC$tlMVOB?-9JxkJ&(N7`;T zJEC-K5jt*KJ$qhF8~c&=`%54HU+80rdoFNt&xMxfI`K^Xto1Ss2P=NadI@XgP}R@h z;@TahPPuB>LV=>6`C5L!+pkhK3J%|>l;#!0b4r-%;$Oe^;vCd}O-V=Eje)mPB zXuYlM{cqgiX;Xeptyfmpy2a55)3tUyRcCK)4eNE!#f(U~LqEI4wZ;<&eHUQ`?AFFe z8Wz1>h``Vk5?V7Wjx$MVjN2I|DH*EK=XMQ_xXFOnv^aGIE=g@NSH{v@=}$b)S|y7L zjO^gJ1hzo&GsbHAwO=~&e|SeSV^QcimIv_xd$fVutam~r$g#r`#xnD(C>7Zg8CaNU zIEB05m^RY0qwzEw)W?mb5%w&`KAmMtXE9Fh7I893uxE>~jiP|9nvby0v;~_j#g0w! zGz>N_w|*MO${Z5xV>rgX9NX7B*)v7u4&wgn9htG^kJ{cyowQ>3Acpx2vmx|<{DDm` zdih0egbfH_**l&u{(3w%tz%EYKWFXZPFa=JSzFt~!p9;N zVqf6y=peL2xkI)+1_V4-8XV4aNbo8rGoRunpFhe z%^!v4eRPoM#q5fm6|=rpR!}5U*T@Qv;bzq)5kQwf1ccti5JLe&wh>yNg@Dp-DwxJN zvewySnOP_uVxCH%HZJz7y8>^TS`(KOgAS2|kwQtB-N@j6LpmQsh*? zF;AB((q}R7_w|dIiADITBSsi+I26oa@RMS{iw_Rv?EGxjpSQU&8s&kBb}zk$Om zm{pHcn8=!geA5a3g6l81{tv(vf?Do?OHxtQDrW%yd|aEvfd(|N&%VItSs3RcNTGWi zn>`;UFpCN;(`BKugUwqQV7h}Lui0_fzJOzgR86jDrxjo*W1+I6F{GXdfq}?O%Z0(^ zid(RZDeKk6K7)|l9osm-B&iZ$TlYAQ9g1TW_MH&dxACxk8`Bud&ezY1VdnYz`icKT z82>S0v`YT^zOA46@ATUC=TTo!d3Cm(t4te;{N&*i-~HB`Mp3gNug9poj@Uk!km?g7 z_k49eGT25w^EOPz1m0#29i{)~<#YW6R_st4Q-=zfjUi}ez6Yq%Vz5~{t(;@A5IT;q zBhhhaT~oJ?EoI#kEWx#B%cqqK?ad!IG>_lr(K;(0f;|p_?>0xaYH}&N=sa6Bjegg_ zzD#?RcDdN|!h=J(0*&C14uLITow9K;^SELBZxtv?XVkNb+!nLQ{zC09)c((-7NNmp zM6&j{vUItEbuU6n)8PS~l`(An3|MICeAWpPU^Al}7PQE{yvIUm#cd>|^KmsQm@;g` z$;b>&VAE$zWXemSE0X^4>|kVDilCnKBU!GZbP*n)tBWM=5HTS!)y+ObW8Pf+rLmo; zwv%yVMi?>nE=wqyk!^AZNWb*om>;ov%f>Lw`$lic*MB#9Lsu8RFyY0}ltAab-YYgo zKRxbmc#EujW?oq42!@e;ANOzeRBG)oN}ccgmh)SYZ+T9BYw~2Ox)R1~8pFKgWb^Nz ze;JUP9`~wAbzhqBD!jpwy)A6sgqL4}>e|(nmF;sp<%k=M(?P2}4QlNnYqWU_ka-)# zw@5h}*~XoZ%jr`qh;AJ6>Vuq$s^G@dg6NV2DXU2D6J4&CL@p=f;^&y|FpF*wM7NMp zRxyVj5Z%6>m6R*^WEA$qH#gcDii<8wfS`>iU&P0kg5vgdFxtCMacOFMS`lsZ;R(Em z3o2Tmc(mZ+=MmTrFLgI{96Gz+z(~sr-1V#t;#a(H>U=O@ovUCS<|lCM3;2lsL_z{9 z99aSSzrX=N!NbG*!xi%L4SlEg3%I|4YoSd4{lS$u7Qh}I5r$H9(-n`?+(rDE4R)xa z@^{{`UlPGAx{Gj$R@iS`9P0!Dx5;*|VjaqhsOUObgtx-*)XF5f1!}s5%n9-(#g6-o zolzT^5%%@ig-LX)W>EJ4(JeBtvigLH<_rRi5E~CRZ_J0d9&0~jm~m@8)_VMb88&^b z2Q=}kF{2j-&iU(ye{l`??61#_`77SyVuw!iFYq5Rd_~EocSmog8G?nACm+BB?LGXV znL?UOkTP?YGg4-}&8MGy`4`9KbF56dJK^Q=(M@c9HCv~8dE$f#g6=x*L#Rt*UC1s? z7t$skL3I~xCo~GLyG{@5u6q&dUg}GqUfQk0o>+MC^VoS@ zx~1|?25|)nQF(LKyz&c4@#;uGmz-$)84)_`~~4( z5aw^d09yFy;lDq^ScJwlHsfOEMRbxap}Z8yHns?`JH+AMX$W=2G=s2R7e5;16AjtI zh;$JQ3ma8U6EeD{&CJ<`Yy(T5*H5cTpI?tGusV)CZ(m+N_B;mFydIklfTndZ5lE8= z{IIh~+y;t_aVb?~)0UF4*pZzYDL*R8i}<|5B1B8p5C!}QrW4fJ4{bl#ygeTbuVPfF zoA}gy)jw<)X7nm|s>}8-jC|Ve>5+EBhuMvI-u`pEMQ%*}^L%Aq{;p%27R{dYBjRD% zw#kzh_VN#yydjLWeY8v>VQfaeHU3wV##`|teSC4k_=%%jP$1O8>XwXqc|0UpQg@Rp zvtr9`*1gYJOW)^ba7rh>AT%}=7olOw88pl^KIo(JJlvFkn1M6ZIJWWm2kN`56ObA; zPxBZ^yYssjEv9*_m<{#PV?Rhk>!pP!;4}JXc!&4zYcU>v#?;^rxokGW=RMe}=OkQk`C0t@*Lg>VaXb%^rPWw; zj4Wh^VF1_+cNJjp5$3uykYCMM1{YI+xlF{YidnMzZ-x{I;<9HG6s+2wnN?LjgVDg= ziY77|pq%pgV$`8~soB>y6L zL1ygJ?3c#>?l9Zj#GaTwp4V(U>$;m|Q0zL$wf*~uq*3yA{sp12sp1GNQ|_Rqb8v$0 zaqM6;0G;BTMKi>cb1fvheli`+n=5L5j3?dZiW(W?bcor!jrp#C*}UZe!A4nHzm66% z#?LCmE@6wt+C#7DwAUi`c?~lI9mlGfbb5s5?(WlTbO>fPQAqc+(7SYA;qe&^p-;Nm zF*pi)CkzF|9;6+QDL8vNrqE+L_PkyC7qxA34C~kwb$H9y(C4fRR~_ zVE+H0>i>E>bv8217g_o*)hPOSg8#RcwQ^!mxJ417@1ElSrLtsPY~!-0vWx4yv4vaA zVBx^veKX&B>&>^`eDe+NP1zf7{{h8L!pfzRbU*LRs}HSQ0y<+uRt^7+jpkTMK;kRH z`lEKN5gRmq!uWCc%T2(HmUZt?##$#pQ^!gXzTzU6{DLMz>l^Q1hY*>iXsWl{3U~LF z_Y(^?9XzJo+h#vevMn&JJ@y3Y(h$z(8*U-_M!N7DJaXT_A2fEPA815b5A|-T@ANp}nE-jg6m=kFPvH8Di9sh#oCTl^lp{bCLM&)Q8!{rvxhG{@y4(k_QC+abu`4jD$*3 zGmSf2GrO{|UGvHg_m)*ntJ~Jd(j&KTGOD^%FNSZ^Xd=SHLN}=8KAv9Q-s^mP{rquF z-sNw;F@1Gzuey7^BRxq=N*1v9+_@gD?T67DV>fS!+Y}v@=GUW@>NsdHzl``7SCHE}x5(Sw zGX}r?@5|Srz*a8j{D*9eNlH%9rllvObwqGunK1!lBFC`ufv*A}ycNjc; z9v%gWHnQ&LNVowKCa9G1b!+9GAu46a8h000^u($)YrWR_`pa=Cm!KeJaIi6?LB*&8 z)Sc>fpzuXM6k?*%`=gKo6t>R(OMessDGJ79W0H)bpjWkra1Ws1C8Dt0+11V6(?=O3 z_fa@4`u01Q6{|hh`3DByQ#G1Uke)sm-4Hb>GRfy-5rwW9)}J`7167=yfP`p~gp7ZN z1lY15u0LDdbHA1UJ~}_LJ~G_ryQ)H ztrigUc32qC!LHqANoWNJEvuSWx2}<;MaG8lk`S3};vih^Wg!Vm!NJ-*o`Zddc}du{ zu8)HTNJ5>WJ%A0o6-2;6Pp~8*ACh3^AX4C<>j4Uk2_(^^2r&;R!Y$QZ^|+A0q^+xi zpik@8taODUxUO97Va5Q0U{WD`6=9ND5xmx}c3**C|86-t-pfxB9HMe__VC`g#ofc(FF;wX zYN8Yzfgs3EABqMB)=7#l`zZMMI}9gz3WkPl!ZAP(QgSq%|AZh=3?xsFGz_Z}Ie>3) zy$MO!$CIGfi~t8}a1eyfi`cZSkAp~XKsFDj9JrV{AYsN(Nwy^if@|P8h&FQ&A-INU z%E3C5Yghsfyz&g{&h-)#2mXd|CPHuy2ERTMZU!+Rp*vWTOi4IsQiOp>kSX>iBp4q_ zLY3-{dR%aTujgvHin^*5F3td9l?QbV7J6`B)d>>rtMw{!t~Ygdi1KFmcoMpOU)eE|79uV0FJ@mKP-xJkeZ&nN2BTbCqTF{ zg4hwBgGNygOdOOu-*@3T@REZAKgz-OG@gS!yAUE!4(uYrDF-X%ydJz27RH1bLdk9e zB7|-lA+VxbXjub~9d4ijLR1Rk13o~A^6jHQp;!b8d=Byy9H44&P@ADPhLZ@x0S+O8 z(Sm}Xz(7~9B>iyjmZ!Gn0s=L43j;ww!-Gd6P_3#`zZk3tR=5VM0%&xw99rPMdaVTk zhL9#zD*&id69CYYDg*{wH`D(2MPLw_N_Bwt|CXfQ6fXI>&F??d|3{LO(f@}w?^QIx z9SD)ZD}4X^(f&tZ02y#{f(*d$LxO#mEq9IFv|{zzb@D)jIISUu5GEgCL2q8|ueZAi%_I@+%{q+y@et5s${|3G9chIQrSTEsw zKQARCwy*cOe!b5qZzwy0B|8r5w~(!N0sx^F0CXKOes2*K2mnNH-1ML~s8`)qkEKC@ z+7Ir)b2W_#;0ruWApv|rFo)={5d_qz`Tn0n1H*y(KQ_55#iI8&#YEG{Ffc^y{cU>{ z4X}P=@N3GTAkhiT#2yRrdA^H&7^+)v4 z%~95AVJrK({-Y(H=B^J)OrnOrJ=dt|;k!O*jAU>2-OQ{^N%r2_CkPIy1W2BFic)Z2 z)BqC&KRGwL7&Sw-CiwbzVHBWrF-FKXr$0bJ=vqoaw89rbb=KUlFi@~NThxI432po+ zp?P)F8c9;5zP|*l_qLRPuK+>70Um-}DglR*wW(aVG$LFS0n!fxqSPtdgC*H{hArGy zy92xq2pDJ(9(Kh)DF#idO7#mnQWQR3zCnIotK3}pkiaYhpuh+SYWpBqnZ-j8OGSW7 zH3%|*p~Km;J*ARONdRHfdx8vXjx~euJud_MQuiuq_^9wzGYDoCa6&M!(qo-GXuaIy zn`Me%3=U{4a39+v7T6U?2M0%bqg$e^Q#BSS%vrqFgo58X0fqR3dW~L0fyur@G6|FY zBp_TLA+>wPjvH1fa$s=dTq~dkdz?)ir1-AmIao|N&_2k47v&&O;9x~qD9?c&zMv;d zvfr;=RD-59(xk|cJ~apn#b7bG9|&IngrGhUh8#@RW`u_$c-SO(1I7Y`n?Xipxw0)- zvOAC4Vt5h|o}=SMlO7}{CMB5$jI63cJya?8-sBq;q6}H(#<`5(M~fK$(jfvb2Q3I3 z%yM8sf=^E>?+(Dh3Ch7n%0cXV??=<2;$}n)R1i`FLka{A()KFuh~dC1G#n7diC%m( zK>ZMc!jNEvul(D8ETO@Gmv4ZwN!1Asq~PEu3PMkGYm{}m83b+y^NxPTvwvE&mR_5Z z1_XY-JPc{^2YWRJ6AYO=44FRsI>(_;^wmjl=H1u$B6U$eHi;;SdEJ0z@2kY4<8BcpN5K$b#S=5F0qVt@82kIf zPlH0)qUsW8xW&`Z9nC@(B22O%&@gD$Hy)G*PCgVD(oIZ)oTkO+_GpYe4P9fT&p$g_ z_&0wH^TcHIwsP9u)@vhV&)5wcR$(iEVQ@3LRzfLqoNqbT^I#-cfDtKx;b#gPGywsK ze!YBnFjhSPMkm0aL&*DUq#h-Y84EzhhCVW6AS25NFp~5KNG|8c_&1sd zkvD_%%3I2oV9B1`9y1u>5s?BIJ@I6lrN4;mLjy8T(@K44^r&vBhd?DZ`YA(#RVyJ9 zh#HVc5YbQ~W@uHFo6tym5Dogq!)QeJp|LTVMJiYm!=up^-PRus@{VDK^p6YIZ~?er5Je**K}4e) zK_1O10g9#Pf`or58U`}xzRx)3g95IZ`jRJ*4}GgatM7xPSyT@SNr%gB6C}|a1xR+T zLa%9(MM~OTq^|tnLcqjVzyudlfj^1OF#8kANh{9@@sPyv5;86_$pnfY4+?Ud$UZ6* zp92)l9<{nnkPum(c4GzwC53`Q{D}X33s8EM70Tvd$=>|{Wv`$h6qG1U_^y?`@!S)G zVgM*(cBUwJ4OzR=1%o_*;!V9tAk`3K2&=mGC{ET1oFwrQ5}ghSNl%4@guZK*5O5Ny z(FTMFoMa^IRb1yedBr3lem?6wJ?QWPfrYEPr>`O;NcHU!UxkQCo2nOs3u(;FGTepq z%#qIM_9$6O_{u+VZxUo3xfwhr?|r?R3m^(YF^Lf|InaevF~!6LgKRfz7D8dD^yI0Fwxf}CvH#QSS zNyL`xZo`!l8yo8D>T0G|WOlIyJxUT8O( z7+QO^1^_38D&4Xbcr&;eTyH~^b~{%%*HKZ54)I;L)=wU|a}CcMhU{=xeh=`5v;_QB zriaKIby&SLe(5sDFI*pQ2?B5HRlfarn-AV1`}3AcdDBwf7(dRxiRX+Wc*{(8RI3v*sv~@&xJWSiO?|!ukX?Z?;@e37c+ux~SOtd*&yMHHk-qoh7Ik$c~ z_i;geQ@I8&zR9j_D0u6wla1GJrJv7wUip)gK%2C2P7$t%oE+Fp4iaXjkzr=ywpqM* zB@>Ch{!X>AT2il1Cerh4TYYMtSRS$p&u?E|T;}gJ$p=fw&#smc(_q5Ld~jeaN3^6x0*)^AUmRUOaN! zc9@atHpfVu2Z^R*r*RS6O~kG1N8G1xI;@D@ZJ}`KL0iql8U35hyxj`wQdTJ&gUMdV zTTXx6)*9pW+d7YM=Hau+4~n?O_4&bK6;W5H$Akm~`Fr^W`dG-DDMI3aTZu{Dk|=NP z{J=@zjlLm?-ondUWNJ^TbpIZ0cgk}S)DQB&39~B*k&dL$1d28;^2j9sM-wQ&Hu*sc zoI8MnzOAJC7N~MrDnv+r0l}RrBix{DS76b3+~)XPeoRMnXOt{4v`^tUIKpSXG$ZG~ zUO;Z!z7CBjZ~HF)d8h8LXs<1Gnz#NMF>B#ZTks<0hRf$yQ&K8D!)v$1Uw9+y%tQe= zS^GCWb$Vh~^^f826mX>GTl#Q)R>087<2LKXm&XZH2oeiTB&LAGnyP9;wWLOm=jS`> zdIH2hWj&G(%3h+=>xik&W;8AY0sTt}zI0+W4t6w@9=kw#@k4@nHq;@F7z2Ux`P5cRh6z~biJ zYF2c%2h)SXD2lwZHTt($pxCLrqijG-1{R;*ZDKKsceQKd<9h~T5uSKc?8bi5cUEOk zSE+}n0{uMIieP1kJLf{B&(oV`CB<=DyXu^Y#ch23N@I{V7?DIr6W zQwVeacD25mxldW_sWV?)9QS4H8IZ+d^3;WxnDDTW4I7gZV`Ds*FLOG4vyaABQ5f~E zcR=GVfyOi{jJ`g+D^88#X*8rDkFv*)r!jsvFN}ROZV9F|cEJ(rsUz+&J7R-}Bw{0# z#j#1_kx=u07y*PdJv!hO)89lFT%a~)Smz^kw zdR$YvChe2o9w(RPR2s>UOLOlLPQLm2%u7QF+_U%+6c$1gO%!SgW2mg|t!50`C#0}} zNDD#=Zj+H&%7ArVK0aGh!sMGHJeL0Bs|8zcfktkG?nTLj7b?eawgQm`R6__v-bQFB z5sCDs!C`8GC6Qe&MpsF)nMfZ&AEVY=5P86_*G#0|MC6NMn;sxi6vvO=bXd79yH(Ie z>HZyo2JpCD;E}c9v0YiMtObwytt8%#0=b@sg#wUX-P@S${rvQCV$tBWwp(Wi|asv;ATF%(H}3nZgbdQ%a9sT=8xICa#L zLwQ}==Z>zlAQEHfRC&n3l$72Sk}QpiJaU>R^4Cf+vxVHTKqNn0RjCzz3b)1II=QY| z>mv{9RbibOb<-(4kontMqkDNEXPE{f)J+fi+X{bEDnlUxxjUv)^wY287Q7a9bBVGl zkP4%+VpVAEcD#tatN#32rnV9?VUa?Po1Ta~g5i+9CrZ3%ox2x)p^H zFPK2wDrF|_jmE3tF*4+<_uj`Xq%XhsUU(B>I=E_l)Y(%l#U($xD4-or2Ivk#3V$LE zgi}{S^il2`Ir3fc^-2|n=XxVMGH?r^w`O0qtRc@<2 zeFK7xxT75br2(6cLN9+zkA7CZ~{O-o8id_bhYv zSiNdxpwG9CvuFJAU%%e6?wbX({=C2PVP+(S}#-% z2+?LpNQbJxq^R)eX~UyUtj1(`MNw9F1$L`hGpliRRDD(4{BagbF|@MP@nzW)sId?(uo2&l~aJ45ifvx zd(4ngBcE1RZ5XAvwnTvO`TEZ`wvy^^BRLv2R(@7OAMSp-2RQO>Tzr|^r<>(drz&t; zs;O^v0mmk;nsf~6#2rLCI$A8$vuPkG?{!<1AK!Pp{PsfwAEb;5jS8ml7Qt=Zjk&!F zNv^S$jJ^{Xv}VJXPzOFwpOyiG`J`*9*V{}-wAZxeO3+w~rF zHPe}AbbTBjj#6C>3Qpp6Ri9#{;b@PG-c^zr2VG63Wey^w9y=(cod`z_S(2S$2D9_; z@sMnamQ`lj~^Mm4@y&ZKv(G`w{%AqoIlwlaN1$!^j1)dvR-*NShhQR>sEcd z-A*NS{vxLlSw7%2=@FbFitOVw_J-=dx>-FcQ>*X^3HA3{=}HS6)|ffvfN8!7(}Yxg z8i}`sq{j30E#X_zD5e1&>JBreyS^7NjiMuT#G;VYD9y%jbqCO1VJqhyVYk8Q%;8FDuRzS8JY@}iUUA5DcIM2wUhIjFC&_}dU{)r zf4E$+%-hw;Ir?LeE+u!TiQF_wu4L1eo&!ezP783Gl?}>!!6bxa_r%*}^yk(O z+$ImiZB$GwxQ(PCE3dDyKdI_beK#t|FHWvhDFfVGm($TaKZX(}VLMfMmfQ|ch%Ngi2}4q0JU!dwvY_p zK6UEN;;B<}aI@Ak=Q`R5Q)j4tj)GWSUEfe&UER=7Ta8$=x~{n%xyqXRl4g*~)IEe| zHIY_ss&9S_pa)`4w05_ih&}Kypt}HQ4*-QfC$ig$;Jdg@;+RuGLW2oz6U>icAYc5k?Ax9?0!= z>2+n|dc*88gL!G?r$xTWvH&!0qtWdD0q8~m+KsH^3vz)_b&#jIz#Lg8`3w-MO$VX- zP*f~U+C>T7u@edROrw971*1*MMli~uq9O~BrU{Uusu)@pk*NTrDIG^hUj|eR0v>`C zw?J06tL=le@m}g6Uk}jYOslr|h?UOmbgB-R7|qVnr`c_dFf$sFyq89>P}gQu7J|~l zyDTUTHBm}4?h!s=sJZG+ktRf@ALb!_!2~Ia$Asjkv)k%*{z??F1#H-0j3LpI$iooT z8z;4m;8W@!^_FQM#cS%nFZbz>XKG4Z@<4drBJGEo$>^%7Q`4iTPOT^V-<~@4-F)1Q zaq83(5;JuwN0?ee^{)h4yGc(qp0!X~TW~*w2C$2p@DWK@4Oh+74g_q;l#)jRTiY!y zk3C`NmL88Szx$A)W&_wR0DBuhCCyYE!<~~06`8>GxZA?zn?t=;Ie%Upt^P4*qvkh` z-#9H@JnQ{=d;8%!){HAvR1>auovU3WifoGOI&U|ss1#S!^`XKiSMSo}+QY-@@3(Fp z59{C3DXbkkSsDjKZsg2yKo?-$D#Gd~!Yc2B6{{iq-|PqLb^+Gi`U4o48U4Hc+vN3F z4M9tv?@fy{)>3s&@N8-?d;wwaV26B?TT9fk3Bf zuL;(@fOYtm4Q5!Q687rTfNG-}4m;qB1D2?+?}w@;EG;FaD@78Seh{S6MEz(wvO)<6 z9skpj6-sP90)m76`f++DwIP~BN#z^gw&c|26DNUFqkQmYs-meW@hOkOw29dKZR(1z zrY8bh_+gN)*)*tpwqM|Cw2mEjo+Mr$5o^pXA^bRLgw1)VLiCmyDA zH|XpDomG_1P(>5yY*K`R&RBPsH393^F4=gfzT$TMfsE`wec|Zj`1RsNL7V&2IgW;^ z9io_ay4FBUcR2HO`toAB&TD-j@9&wo9-hujk?pZ>Lrd%i7h0ljiio!sx%6;7M&r9&; ztR3$#9~2XUke3kM*TcuHXANX<tdIHh({O(m2Hz@ z+;hH%^=hJF1dE2TMKlb9OE;D69n>&ZQNsubd=F_cLnsr`fdQN`OBShJDMlGhYdT;W z+eFh4g*$|wW)+vQDHJ}`G*WoepixH5gQn4L7VZXR3rwRoM3O;GBaxa0U!BUEhDyJU zY?p|(k;2;s(ql68}I zacjJ7)Eksa!7QvwVHPp>VHf_9f9+=%bC-GZx5uV-p%&~S#cUUnePUhmzS=RIq63z} z=!{cG>d3OGUlH=j)YU&{7}eFdrF(TVA+@sVHo{pN#-!}}g6ScK?$wLR>$9euBiG54 zvHNP1#(huDP06Y+U$nZL1TyaB*FXEF-L#E?%Xd7l)7kGJnb67q1z> zI66hI(cxMPuaV(g?R=LS2d5blp+UjXsax?EYQbqfqOF4~-PC1Rd?-Tn!O`YmM$l|Gs30W|8#m`$tC(&0!RcmB4 z2sc{>@)w&qGVI`6mBuD0JEWVsjDrYzzDgyXO}J|+B{=X4d@~<&BH}i%j7w8+cX>`8 zNHAFkiFXSj5r1zYhO7hd3b>7V)29*CGJ4$C>ftBeuGBa65ORG=5h;2PcVKP#B7*Lh z3-U&Yb>{7I-ZGBUAC+^sM2dWQmuav4Eu%d4IO3`k14aE0xeYHj=cQkMKK~!V%9Gb` zl*J_m#V=Uk^tZpi`}&mEA7L5PZCF~y2;WS)s)CA%)To(@4~-dJ$H=7#l3cRYDb_u+UAR@S>)X_$brRTbM?jl10?t z6(Z55cgK(DZy90SHiOwRl1*{dBP^p)rBgqzR{DDeBJOv0!SZKeR)w#M2tiRon#nLy zsbNI9iiUxFjDi|Q&I5+w{@&_-h7myx!=N=#!^je&{^8<$3aviGM2-#bJA4JRxUP*h z#x%n$Lc&}v&BFepC0;NKAtN2VnXgAp(`q77kt(inHYmDGhT%DNYUqE!FbpySXty+s zRE`X~{>FJyubPC*rNJ;>0KWtYKVm%k$#90DhOrDrQ-mk{HcToKf&d(2hCm4^(levo zdn!L2`FUEMun})Bu!<&!RD}H%?&EOb2Ur9Qf!GAP_rM}Lml+tz^XGYc;C~A-8Ij>v zurrB!kESn#LRRs>rsFN$EhjeZeK=|JkTnE+`Nda%`C#_E*^XN~8ctt~c3JS3zqu`% z^RJVCGj9NE=o0-zyK5c%M7nd0^Bot_8npg`HLQU(WbfqtM3ygyI7+aFI9jlVWE>5p z1V^zoO|S+@y07ar2Ts(&pthHbI%6KMw@_7euPF;oQADBIyD zIzuGMsXg&e#f4bVdLVAiOGP1{P z33^4hynxsvcbNMKD;WLYfEOvmYTiBI4#*E$z_4r6Q4Qo%!%^)T^v_a+_cxc5*p=pjQ;d_3>t&%XS}+|R#>O#11@ zuK8h0zh3P2_jg{O^4ixwV+b8CX}lpw;TE`v!D%oAU$}+kydfY5r_HpmgJ^yULq9u6 zH`@UnYtv~R7;>{Z=InUJ$rg8UfG#K?^rv+QvX^uS^x=qf1jT44+}-+SjHM zz`wjpjE^?=#YY#uxl6~_-;(G$FZ!TVbbpE)BxrZ&3+Y6<*KB}UF7Ji6CC zr2NGGW98k4Vh?mw|GXjWoA>9B-u>wBpDYf)==}bBfAI18(#2)zycxg$m)~r+G=y77 zHg)svz~I*IS`T-S=3MJsMTZT>h#@-zg#~{;xtJJDLy4{xtiT1{KM1a&5B1uRwU`d8uw3?a%U8X@zAtRQWLi-Wv z_uDr;-X*lb609RsYvm#SBRp5qVm&OOF?ob;)wX_y@c*%P9^g?`=^MW@2?!{nG$mB& z=qj%GUlHjop*M9!ks=^M5(q7%CzE6*L+YfH-V+k4G^JWrS6x>T0qG#92!xV0nRd(n z{m#8JnMvZV?(VY>>P`feyyth`ub!+$j)RcQZiIbw5Li>xj^ox+v83~nu<^^&s5r_x z_1HlW**PdHQOr>rW{yH1LSVgdy|4CfI0c0kTm&lDYoOhvWld+G6f0klUMeq45)8H^ zF+yJYVu`TY4bg8N0}k2GRxT9(`m5(JxUz?Q#QrXVZ%STd+P1IVmAK#)l`G{8Mo=jA2&J0(I;omP~?P7ICJ`};{gkI10{YiZHx%rRLmXQAMAb{43azr|TNVJhu> zBy#)``$=H+)}#XEBowh5!JU<{9>SFn9I%-kgM2eCgXYIzA|@E^S3#L_4DyqBbi&z> zfjPqV?~g(2g(^A*RwZPv2ZoypRX7G|;eGoW;Qi0N*72ph<>BJ_r|iziylqJ5l@)(J z*AyGr{~lhNUKgq)S{pNwU`00qC0Z$``q?CWFpqMoN}~1I%tlH4d=fXQ(yIs|_1;PB zt8@&c@0WG%yz-jsr9h`ZQhrgVQ*afh;2=)HtyWG!ous-~+z_EEzE>?h8SuvI?=7Ai zux8`sU%oBhlN&U7){+fA%h&whn@zn2mwQY7=r*t@!9ksGHEx4a@7vzjmD?aMERd#s zqx}xy3?vtsi@6et3~&O<4c7R_;=-tpE*?X72o4-aAg#=C1Wb-2p!PRZ%4eY09txIm z2J{A(Gq4V4V0~QeR<&U}P5rhw0-Vzk_$k_qBT%bz%P!2p2+N~MTb-|ia+7i!WM%%= zZLpu(5HrlU4LazGvjf5+0+G}4X}=B?h^E^h)8zz|&S`c6PNd^DV553Fa00p=N*e!0 zvlCD%o1%gOrToA}JtXIl5>DVA$ZbrmPf^8hw0j}j7-@97@ryUv4?w$ITK$E4AlGUT z9Qrp!@J&w0XTkeAyikH|PaUqZ z>o&)vDe_VmohY}JJu-s#U!oNOp(g}=tWVKWs<}iqyd?-jJ2X< zzKMj0$*l$te?nPuD^;t?x@=Y%t6SdSvabFib>F|lbN1?0Q}RzgxO?N&hi|^NXz@!U zo}aMeM@RDsn578Hh|W`fZJqC3FssD-j`xo~s{OdC+tai(F>B)?F_B9!+67h6B&c9L z6I9d&2#SwYWo{??D(z^xuSrY06fM1v?Q_&ItbAPYWwHe}hCP1A z>|)v*A%=0`MkVomE$Vu-4YaziQ>Euwayuo)F;-#XldNl5kzGyc7>>h+!=|LStR|tT zZL!=YCE&h(G)fz;-->dnH!Ax6L80!fBqUFRm?Fqw%k9jfdS_?5*l?$*IVlw&^%VIK+ zn6@B~Lt+Y0#KeJ4!dg{1XrkhWMnD!`Q+Ght-fs2?{ zLrfbnwB#0-{Q)D>ZikrK?2SMZWq6}QOg~2R5YxTZ#Z+P!Q)-i#9--=cnk=Rw%-laD zt0@L*dMq*+19XvLzP_w}5*nd#XBh!=Op?Ap|5Hpg!Z+z_RnZA+xgAfLs2_$gJ!u_y zVtUFMKQ%2qb6ZxneReoszWvgVWny)OgvmK|bmqPvFG?50i(F=XYGaBj!RhLQn%-QG zIeA%48H6V+xl1=0IER`VP(wK`xsjSgsnfaTBVJsEZ>8Wp;?=L^_M{r(lhs;}W;$M| zzh$-Fzxlvwy=4;3zuvt0YdxMGvi)-CE==*j8y&m(k*9QCqt>$_a2~B>|O1BjrOJqi5&qYrX%e>3WklvijI;~ z1T4}c9fbx*%D3F+LvgV}tU5l~Atbut?r*ByEI>%_BcjH(!k+u=R4Q~4(kcjPbM02Q zguKH}I@*O+4n;>MhmNjA3((PBohlh~mz|R0!;0m3BZ5*%nO#SQ90!!JWU)y{La}nk zUC?*gQ4$&v8ySFw2R_(fgypi4QAn?vV-oax_20+*icM;+3PJ}5Q&8!4DCl?|oSCCpawtLJw1oR0HO5Ap1&S(UF}M|F zr=``WTF?jSs)jfG!tFecpg@uLUGJ+h1vCDG|OB;xejzv)Ru6?~qUugWW_KdLh1w|4&1vHemx|5x-+q{eLt*M@Fdi|*-- z6h6uRHU_0pz5WY*E!;$n_BH~x8m*fl&*d%w2|`a;%eZnOrWz=y1PXQ?0}9HpP>oQK zjX7D?u#%KtQciib(me(Y58|7@v+(*w;evEgwJTo$3M?tydS_?S^{*HoRPK_r6xNho zo{=Me@2#{4=?R;M`iZVR(rB4-#2=r6#%73Hzx<>2%ojPE0uKCw&MRf`KN}yWVyL}0#{<6<85WcYSSb7;E^$*psY+((<%ChYB!14;5tnFn5oKdQsUy+dlQd z_ZQVEicq<1X=r6K{zCID4JoauKqkQh-v=N;q4z!SD?X~M_bEsTl2x!1TQ7~pR$uE{ zH%)nS6|7HqUj~7q0;`f-uiXq4Bm)Fuj8)&$9-!#bT~x3bDhQ|KdQwR%GO&g>$$--m z3D8QJ02Vyn!~)bolL{;I@@!B-F|h#q&6EJ;;ULNSqazmo#VAZ*aNd3xfEs6l=feE{hHkNixZ4!grqmx&%y@V?@m#7MNBw(hP*QpL9U%zO(p!#sT4Qk+1RNGwC z(Dqf|P*Q^!(ZQjH++tY`f=6#`FPiy7Ru8txDC>urk9B+Ui7q_=3bxhgi4$0{`K9Ha z>dR7DAXq44t!4{ls;x!M_Z6M1{vFy76hhpGHjF+6vNm#LZ3Jv0LgYKNq1IH!TU`L* zZD7(+rB;ZzBkJJ}NF1_Hv^t4nui_JRX)fYe1aU+%ag??q4x5uWB<(GTLyW;iVaH0@rJL6SQH|TBB`ImPnJv zidu&ytR|ETwS-y2tr4Q86{Uonkd>k}W3Wy2X%;Ev2$YiMq7;ZYucV?x#9D7v0hEHt zUMR(IR6=}&OuC3w)QXqA(8f$6W6|K7xeid#CY}-{ewq3bl+m%JDDe%7Uec4B~r%Xu1AVYvJNyi4L*nBN(Rbe}9agQe^(OyQy zU92qJNl;Og(@>?VeBb7fj>TV_sQ{F=e z=bf}8YVSZhd<qW!g#A%V0*-QuL3f=Y8fS43E;P_V)mJyHy=wA9Wo`mWpa1H-}t zFm!_@0zrsVS(r*K?Hc_}Xa}3kw6LT(T#*{C_Q)Ek>jG92<&d0hJAdbn{uX`%`UnToOB~- ztDzfP43}cd75}|%L?kunLTV|TU-ez1f+J&C_7(3f1lxsUWefkS^%g`Dyq1S>cnC*? zaHKG72Ml>KI4CeMV2i*1=1rS6ZrHHi&u`tjwQG?j@!`GAYZ_KdYpiQ{ZwXtyq_xsI z$xm9}X2V7#z+A5~CL>&BLZmHQ0FhRe%j!1;44{4^2bn8 zx#=obPD+wA4ZmMWPxYecRz#wMLY#ZPwIEQw_XF=sKHN5*02C4y8bJU;clkjB?`vMG z3fT@VWfe7PDRSYC5?2Q8JHR^_WcF8OAkD$Fv`fjC>5}d9Dl}HD!Forp#D=XX1tiH@ zia6AidlkY(ggK4uZJA4WS>`UZgry^CJQ|EUB{?xDIVqnQR7eckK@37mK3?-6Eg57j zB|F*N+xjls^RXIz%Q~c9u_Gdk(i}QOwiYm`7E_?rB6+q!Q3~rG8WIu=DM3k_ zWgV?si%~3ZagBMk00EhN>U@z1f~fd4*41wMQuLvfcl^W;W+*$CwvO8sBt{4tTciLL z30l?Ph(!lJ;LG^ZZY51LlE<^5q5Kk4scNsmrbnC{qk2D+Dd>wsjZjd#!rw^wio$mArTovjN9`x?EH zoCTEXA|T00KsN0?2naSML(H|cDxd;~fGBzY8}g~vcL9n}2*MgydyvHBV}g84Og;kS zBQW_;w|G}9SX8vL5d>O?S0nIjgt%HdpL*p`wChQ=QL#1KU5iI7;1h~PCmq$Ncw!urr!CPG-r3Y>D3xqm}$F)UE2 zYM;TZ&tSqb{B+TBLG|Sa#x!GUyOQwd?ZUE*={9=isvtX=qM~J87438AO5V_u$+q=m z-78;sevkHs7CU?7&z*H8Xd3^xu4FXb^{oS%^1N%jFZwWDZ3!n`2??sqZH!HVuL*3b zgtT%>ouoChJejd6qe79^fdW}t4>r|ohP1XJm(RtR^*t*UX=x31HsSX(LNgE6I@Y)q z4lAjG-E&3zz$QluhI2^kGM>1(uf2ozJ9Snrx>~`eQ1V9x@<+)@dBi3rt=;yp%ONeS z0(BzOJ$;voynyg9e-wpiBe26+8zC)TZv~l1S|X$+fJ|N4u5ejepb}Honl%D0HOX7V zmDX|Xx^;f*H*DCrant6_{;*0CtdbDK2U|jFL%9%Z2p=p2iLh1D7Rlc&cDpOI&>uny zd;Al_y7e12ZuWs2E}$}0PKpSi4iX-UTPnJmE1$yVrcusoZ^KF8Z?He3$WT4$^KI6;tKp zTAIX#h2)q>%d0fy6SbO23n@1yEwQ+5$^PBcA@RVDt+l@17_p&Sk21Q}m^x^SlqEVT z>v{ZFVwXbT7XM8f*ZbjTtihNJmMVDr`1-D0yUq`)+PG;GG(j0ldJiaA3=um12a?x21Z47et2AVzcFhn~O5J7%;j~E(M3IDMzC3bcsv@CNN7@`d zV%S}|3-1Bi)5Me-s>92Cm+|aQEi`0|F_8>R;|eJBx*X-h9bK70=8_%Q#rUS>CThZJmKx* z;|mFqf(R;dLv=_fRx88rMc|u&f8ToK4g`%`LS+%eV)s$3p+5*8wEsAn>=#|5!s<>C z5#B|`i*Q>4pdsd|PJY~2*0so4JG7A@r^rwQ?R=R0Kwm)GIjkV*Xl6o2M9W-lX<%|+YIOPydePv^laO9f}!pVVfO!}V1t;hx^Y#L;f zZrW-i@{nwfzQ1b+WTVqZRcBJMhr)2OY3a*+B}ltZn$X@s8El*1giT{(hXIQ4e+ zV1=PlSd`gwUmuG-8Y1dSvT(#m+FAZI?lmOW>A^kr)EYw%k*7&D>u=dZ@~eSgxv$ z|}z;PjKRl^3EFsGxg<>8#0(+5}9C*>!K^m zA((@5J({q6&mkD2wjP41Zz-7U?KV8|r^?SE+8l7uM%K(Wy0FrUpqT@#qtB@CQd!^v z8QHC0(7(aTHOg6ulfwPDURW`owcR)UW4M+A7plWv`QD%o^M8l8iOs$3#^|yb+R- zA%iI~KqlKRnfzjEssdyd3kh!9O7T)fu^N8&^zuiSG_tFGswV20rMLV@aED4HO4v5KCJ6(D_X?a5RWDk;x zNyA5IZvFQEQf|pbP9_yY7D+{RGPiw=pi8!Qz4tkyOHMwux`ahk`tb?sWTuq8p|Vn} zagPL(P_%jy%8r@rHrl(}2BDa$6rs>v#Dr2@#n6%w&(NZe(kpj9+pDLU0HI_vp(K<- zC?7&7MVS!F2M`LkmydYhkV!qx>unvL&uM-UWt9v0f?XzuZpU0jHn}N)Z=n+l$Wn+T z^cEInk&RJwa!a2H8zaC8lZlZcCC#JMwaQ-mlV5ujS9g=SvL5C|kqO0$P>C36jxtAo zf(o2lVpZ`8TSdo@*Hii@FNZqqgFl2s4piE}D~ZYEVftkexOF*)uXPP1kjjJfeKoq%_t(I6-LJ5iDQ(bhHvnXmHirUB<@U?YX z6GZUn%QdRMBlEg-bBvOM9 zktC{wXbZx55=C1I=YusT6g4EsYEb$n%A@mTHEgxU+}7{HA_qka)oD^QEsTA8lS2zJ ziWc_q$-F}gM*PEmTM3$4Sqqkg>sbAt*XX!OZuvF>4_V#~FdtGm0Fj`zs{yfcVxd@s zEenbq;69Q7lej(L;iwhu~lrNWAj$$n|+l5Ans&!=X=f z(eY?^RvYL#AxhLb1W~IsLlF04%z2OJlOj;!RQzgYX}+a^+eUi$;C9S)R1TW!A+^bV z2>LENi-SWos8lJb7^Vjs9+4|xdXSXM1ce)X=NKb4^;Dh&B}O2wb;yB*wF1;&i{7o} zFc4i&iYPq>MH~-oQbfppTeZ@aS(%e%E>8T6_4c$jC+NiOkA)4e+QkM6=!5}0H4nZ{Fzu|Wa!sLL% zuMmXMXB!g)+Wbio8<-+AcowQPMW9j^8WQQM2rEKgc4v?x2g|U#+9B`qwC~I`3mPZe;yB2ylN_vP?^niAn;JqNk&SJB+5yc2~ z3R=u5;+|lSTcjkHMrT6`bWiYT)x4wM-=u}xX>LtYkj8LhZDYERertn64w3oPP*s|@ zC(Xd)>3Vy2Wj!)D|6UH}gd5;PzRAIdUwuvB!!~at?1QS*fCah1ZP6POrl}10O*I75 z3p(KuJJ!>EAyryoAk1VSjE?I%i>5 z!cFMF=#$xs4kCU-2e|eEWgTo_zF~Wl5E_+xqS0RjOeiB}R)0?u3PPObE&_ zhXxDqM*5Z7fCY72Z1$NW;^8)jj_IP4Fn_DsuZW@EA%=Te8^mxY#)cj_yBLz`ebHn? zdLhJ+u885+7^5B~#bWH1ZYG8&4!}L+2WvE1-A11^RGC)tsx~Y(s?wuz4(k*t>X4<- z1)iC(u#VOatwF#+P-wS>lAi{_VIF<6t`4V&M3 zg$?fiUM(~khMT@-03p-6(fbE9%K-@OkPRdtl%_Bt2-qkq8-}#~WEj}ON&3A25H>O) zWL79d*dIbdkgo?OgrWixf<>?1nxa*du+~KhA*6(I9!P)^(tkL@Lkas7CD4urat#d* zCENvt@8HpP0X=dKC8RPXq~${iX^IkVQx{(gbqql}{T)V~xTe2N0 zxTN3BE{7%+^q`P}%%j2ss6e4X=tC4rXfTO`Hiqa_Esi^hpyCijuq)Ru zBm?S~Dk#Y_Sds-!!x^~WBLP#wPl+S}Bet_jYkz?Rj6NByNT8r~3DEBi<#EF`RhtzF zSl|$FDeMn1IW7gBSWuuyphIki9%~5*2EHy5z(TW;e%pD#K#Ehvrd&K?KJ0#IFEqd# zR8@)uj1CD@Yel$(TQOpuHUCk?Iii3^Fi0~MaH)y{?x0}OOaUpWMPf3Xf3}`arU0xWIRj#VhGP)mqm$4(gICZT-~V{W_rD+y z-~Y0-rtkm88Gh{hpJTTKQ87oQG7I^`7zPzYvuHRV5!C39lL&tL^BlU;f zJ}A{i*$k>2MFoux72MHEPyya?!Y`a>Ar^#C2%!iel~}-(aO8H(UHoP;C7@iQuplL+ z2>pqVlM)JbYrOF$II299>bBv%(1QvHnsm^YKp-#Jg-66~09QauV5#~H3V`1@yfJe8 zxNk2gP@b`sset-xOOr_j30B>G2L}SCuTgX$S7A$|bVmhjRqybz;cdKL%6?fSARI)f z(SHmvsIL8Ri`4Mlp+cx3qnR4oz2+OnHs&E{Y@f@jvxV73e@G3D2{#i}IonANL3Am0p34>^h+ddKI=kwdJ0 zgIqLY);mJ8h4ipf02V~j!}TMz&_f~9LlN|VZBasmiDjM0Fy2PMMp#f)8cd2DsPPdG zPbV9g98w4jki&fdwh0W_B!boWh#pEiF*Rt>MUAcnYBaLNoYjBWj0t@xn}*%>cy^4U z1r#OlFfk*7d?8R2``BiLk9f(;RnyAx%N}9N$XySt+(u8(Bizn%tAVRcz)u%}lS&Al#|D`5w*K#%4 z4>b7SKOS&3hmnbrvkXid`wp5NQN+)_R-hu?+w6S?JH4yy+E@!%MCUZq240~d+W=Su zvE9j1fsIZh{dS8`2DWG>rrQp4 zM})(*NA4bWJGhPMW7mG@W5;nJ!pwrppP-Lh@C`Sc)KS9PVxf){LrN}Skxc41dOM~D ze!RIlQlO5Gq>lW!CT*P7A7$F0E!?tg^q{Djv_TIP(hKu=8 zt5>aB;}@h$&MDr$d;f>WKK}g6ufGw$6;E>C+D=N}iKqDQrBkZ!Pn*vOXZasg=gte5 zkQ6Z+#a*&oR$ay)8ZMcya971^+*SUH<+2SE-PZH`Iq3(>S@DbwH3sn%_r2+~_`S&f zTK)a0lj67S{`rr;|Lx*JoYJ3YhJ;=~0=Dm99~*^{RKf-k9KM0t zOKsY(wI5(clYsCA0U>=$6A;1(2!)swasonv*Xu2SK&@RTQr?VWWlt~x8%Qae>%s&x zBBC#d34i;hmh{NDaI}=TpxNZYg|2hggb){4kSQ;iF3Bx5BevMZwf8!4=ia$>s+6;1 z?{aOG|6?OGyzy0liBseAat9k!Tz_EzKad+_8!Qeo;?Mlx`au%FU>+z95C+^;z##Q; z|F>Z118Mhz-g~z~hH(=;XUuu+t)(kgiSG(4Z7bYYzPoDm8o?Xwb*tOHw+dKTvBJ8% z?>kH0dIMaTKX3lLS)LO{zx>L$sWaxxpF4Z@+?oFx41a9`1AevN3kLBA@f>$vyue>{ zzi{!=#Y?u!(iO0w@v`|6ciD19`ZshipBDZ{bddT<{oVgFI^60eb?wouN1uVu{P`vD zVbn`6zA*fmAy4&sqH7C2SZY-@ckO^s-K{z5N{GW17Kd~A$=3$wkmhaiK8=m2JM4t; z-`bK8Roeut`07}IUMzIEvBh68X=EK7jIcV=4VEo!$_)wn7;I3m==&NmcNt>DUj)iKYYsw@-Btz}&@r_PfpL4BTRsw#zTFqL&b zyltU=GgZ=YU((Y{^nx=$LC(@1Z4f8^L7dqAxy*@%3#z}B0TU^qNiRFwhpw|%H(?@4 zUMO71FtMBS_{(=+&h*H=FdsZ{@A&9LoT|fPkGOGMn@1mQD{vj{U**`>dbmB@zEgWH z^m?e+M9uZ@F9Ig2L4z%W%mdYf1`ezp#1FI%unZI(EaCgw`qcGp z(}&?ifXBEDuOYVZ8H0QE>D#AwANUbmphI4S)0hRPF@c=Ml!@cUjvYVQYv$b7-&`y# zGc9#r_RjJZD}{HtmEsC%x%3XV%)GSkl0|R4_Uin3b7s$(u*N}BOLh9GJ|2mM2Q@emdN-ha>7Sgz6(BVjvR%V@Ud0FM;}9}f{z%33qG(iZKU6R z(8Cs|%HQ5PJ!lX{jyOc!J>5^O(<6&75J8V5g&sz{b=4|8+A(^huyFKS{pZd6#gnqX zVDCrBd5NZgLqvkQUb{nkPIebxe@)y-@>aN!0d80-?9|v^#+UPDU2>*QZ-p8i59hrV zi{D|^gX4>Symokulf7-Egrq3Avz(Pt|4#x(1;7DCUIaM)!N3ug>I#mT?*%*j1s3$v z=FK7n96hyHmvh`e!|N$$z4C5WAAM=b*?Tuqxn5Pbs*gS`avkkoew2N&N6OVxcfVVI z=Kh(gs~5i*%sxvw8%;l@i5zl-VnT!>4pI*sFhD?rg6IThL>Pp~Wq{b76dEyfQ9QN_8CYZ>DjAKzo9RVXCN6fei8%8*fC?l6t5XL z^$QnT-sIjA7m066i^V1C#jx{>#J9vZZEtmXbK&a?=FOcwYvzpUo|DG>WyFgkM^6-| zw4aD@XL@s%Jna;(%zgEZHy15C&?sZJ~rz7>EH`r#C=h-bMUgmcn)?t=NE$ZQC) zgufy>4^&!b2?v&N{e=I7B~sVkT{?H} z(zRQUzC)gSapWtbM*ihRqDfzm?p+BcF2M@XyzU4K?q1f#_F4TUCF z@9)_LMj0j%VKPjziy2G|JL=bR83H!pb*$1hS&Y zw`i_6UBIKyO-7_K=B6u3vME}D5ot>($xTCE>!12BT|m;4)*&I&Et?SZL~KBQQ%+ov z2a%$ywR^SS>+T>qP7Z`fQl7qoNRkJCVJAuaQPXKvd6}hLD(jLxd9s}(tU(w4?iDSm=KQR2R?x75b;AABo4MAnvn+B`qu*<)%|&- zIawt9};jqe{n_1$-;PPriDX(iVY=7bRB zINo0LrUN09Mmgm={$qqxck9Wbmd;(6A$jqom;M4fGW_X*y`QAd#XkxVyB)dV%fpVO zcsm0maEnF(NNy8Agg7C#;|?tyG&z!4Qzhf0zS4$lM>y|@WXxOC0i_1iq=Ap#P54N4 z!G|~SvEh(8)*7d(+}|2Kcn3Xh}ypw3c z9Fv*YXUB@% zV{P42&Q_h9z#aY~`4r*V6Q``l-s3H$0p_$vEakCf|w9eXx~cyj%(ocvkJ*(~}Q z&d!7%SVx&tV8n_alto371YShwUk9Yr^fx(>BK9%%wI@oNm|}$)X^SwXr-uhJs1i~n z%!&Npgc);YO&d1`_QTV2%A~Qcj2<&~+_>?Rr%sY(kE<{Au)asxJf4T9B#GD9` z#7LPE0ob>mhh2dc5glO-WljGWN*3Eu^2Yob|0|TJfei8Sww=3q^d0of^Wum{u;_f) zz`h>cm=zH^)j0B|zimb86K<0gu{o^Bb%i80?^B8u$;J+Q>~xEaKwML`-HNRXn47O( z%Sf_Qr;r5u%ieM($&OgTDX5VGRD}i+J+&?^3@~Z~QBkq>C|M>c4fc zq_>=LM2#o_5-9+cGGEfT0Tx49~W|)>r|R7;&^ThItsz6@lPP!dcx93eVzn*diNXpe-mcf z(Sy1Tb27qMw+WLxX9zP@Gp6&?R9@4>>Cy~tCO=!6Wd(V}*>1CDPV*F}h?BcdoicIE z$iKYw%GgP$_>6ja?9^#fTf>f0vzhzaLYSC$7NkB8bC-I3gpC?X-k4k6fo|L7dM} zsM){!H_Xf8MQ@RLS@QP(j5v3Zh~>Hn2!Ogh+4HHv2n2^e_soz12!6=92%R1{cw?lD(UVlgo$`5g7pD>}(>Ah^@^XtDJ~4ztqXQ zlriE^X}{6mgyHqph_lr}9O|9H*3^-kKeWVJ;#7M-d~n!Ip^po3L=dMY@@H1px9Dnh z*N8Y)3>l%(Ba(=dA_qSSDHZ^SmG%J~>hbMk__U;?w6w&CCk_eNEeL(^z@VIdr3N1=*^+s=p*@dBP2##O>pS? z_m(Yub6C`Xfc8^V# zAyhuc1wyJdM4<$tP`)dL*kA!s=p$2^+s>ln3A{`pHu7ROKNxqTx({xP78Ek;&$?1b zeZDMBOurBJlNdKwbjHw>#8fg$^s*RwA=FceDmNB%73>__aUIAh2H-y;qb2HgdQ%^9;id6^beMf+Q{+&+J*##*^cjI(71daR{KsjvGG#)#K?i#F^X- ze!68$09gfdWTmgfsQ zfJ$;RP$^cTr-g4UT=X`gCjt=uy!3wyAhAm~O2Bk~viDO1hd%wxGs6Zw)eHQ2>@mL6 z{Xfbdx$E#pg+ILacZ%bw(gd=he2lWGc2_dTvm>N_E#prGVyEDZtl360F$=9lIF1cS zz94$aP8C`7^Z*1hW7C)_$KiP#iQH(pxrmj4A~Y*Npe>9*+`juVfZjJKmS=aE5FxQ5 zkPINRu3mSA0A$1X8UYBil$cdv*_T8E094E-696Cq&j_mwp9-aq5`R+U@F_K=xKu2Y z7_Ux%Dhm87;i^XDunuK;UlQk=d$)9dP}j&TrVZMMMq_3U|%PQF}g_L%;+ z>U-zbaLH#pvu;)&A3gcxy_@+RhwQvnefULzdqnwaNA@+3WW-x%l4oA{p$fo}KTAI2 z$9{%0aPAFK4<3XD6%pB+hC%fMIaH7yAai3xR?^m|!QpaF_plIXdRjgH+>?b@_@hD_ zYEBtHWA;ohnKqtNCX5?1X6*QhlO|8`oHm2_BF<9Jo-@ZfTQz5{Fi$mqf%vNU8h$L0 z=1cS3XU{~!M)c}FecH6Ch^>(389!#ss8=RGrA zI*9;_`%XBe0((Fl{(JT5GiS_{@jb7)a8X40S-30#JL*f9fgb6q`pV@i_paW)Mm;J# zqAdy0mgvBa1aR?Z_-4`8H^}`e=;^YZ&=Y4z&zlPuE?R^xm2Rz}r(Zu)-~S?U!*%7m zJl+)@D?NJk9XRxvXa6+hsh$82kCe^tGd^_*cPP~2SqYl5zCZekC_yKCH-V=T;0eJt zkau0dBgNTbJC+i7))ROlG@}v-JgT^)26U&OB=YQ^~)OHsb67Q$*-4nnH{-!y~Z1%VW4xwB`12U`U_3ikuKI=;7V+8I&I_D zx>9H2Qh$fhVGpyEl$GTYb(*^8skQA6NTD7yc(7%N4XthU1FZwi0~$~yGWM%RG6s!S z9y|)nXM6Cd4M`qCj~6_8_QZ$uN3^n`zTCS{KRYZ&PnZI?LDpmp%0g47dU@GlA=?UXP3->2 zlf9lA`t0-1KRtl_hz(e1%D?=pc!*(PUld_M_9NGT1*4C_Tkt+9`;qqL3Kskip{2E~ z*iwX-XLp1c*QzTFan{&Jaw9P_7O0ScCop8>$zX6Z6mL)xx)c-%0dDEZF^D3NhA|Y| z3qs*e!?POAQjkHj-xh0%;|@5;uxBUhOCd|bu`G;iNg8!V-6bM}m~SOAgr_&NB&BS5 z2P_E}bJ6wN$A07`6)Nl4;PnX%lvTZ$7QcC;=u6c1$SK6Qvr;%ea+h z98IWaqg#EMJE6=B<%3x}4IY4!|LqlXVyDDqJ0+|aI8Z`WoMuaZ08DIj!GwDJ5`QsT z4VNZrI%KA@$-AWQP}~@78loOLWJu%S+CkzVD_Yzd`qw`t_Pg8H4HQ5lro}_* zA$VNvA$h352X_#{1H9l6(hTzGfeea*i@v}G+EL&wMo&cU1Ch*FRDvb}7UDDsSrh9_ zX@)dYHEXtY&ZBb)6|Vsk^XAS$8W*Nx=8S3lbYW)aX{>}aYUHTVZFrN~>7jV`I6Bgud+nhUp{=x+c zVvs@M@I$zE8KAHrfRV1)E?MCu<=*4XoxhR;pgQ?w1 zu9(PfG7t(TE+KHScdqr4&l(vBBtT&xSj(wB3J{`CV=~eN10ga4@i-QkCq_rDScq22 zMa$k<`R;}d{1R>{zf4??t||ry{ylDu)!XW0^1Zj#f_KJ*b?yDu`T1=KB}iDd+f4*U zy(@r-hxR1138GkGs|a{mkvZ87JHa@S+>#S087Z8g+({EB{4wiG`_9k_C-<}1gBapO zBizqbnG+4zyGfkj3ax~Rcvnn3F?R9hD7&4=P%x31oRVT|!HK%T(hzB=YRJ&WA*P|+ zkY5H<-qkX&2DlL5Dok({ZZHr%OdgyQE@WsBF2tTgJ$ir_Jt-FH)w6fsenY{FSu;Gx zHSuEXxXGT=P!r}oCCao;lf01nm?@z0qnMz}G}@r8~tevu1cr8aoP| zY-7-7KXdB1kn(1Id; z|1a6$y^?jv6FZhD>{w=JNB=%ZN&j!yA$IH3wM!S)eKO+3=LYwEvdiOEz@zSWB|aED z@EnYzhmGK2^huJ9#({%ELi-f-fZE}qPAM$J8wbT$*ivSA*@!I=m>Lr3H&<}$L& z>yh~2tJH=aPT_|wz|D}Vn2e-CJ32yK(D4?~k+6@CZH(g%-92oT!;d`-9ef0*F*(rD zpfl+%#HfJ|Gm#_M!1i;<s*B3lKFed(81KEJciSFj_>?bwM79`B?2w;j{9J!k zNqY35SRWN**TwlGxvca}q@)Ooe8>P){{KFC}TVcmzpGIgRf`TKkAtK2T z7q?Xpgb>)=VKzSf0xK=^DJY3^rU)Xb(gBnq$vQv$ehlK1NuJZDd3liM6C_VB3ve7Zq)xA0yQ&c6)HT)BD?E}LR5G@mx8sAX2jN3FrF5+|8IL?AX=;ZD zSyxx%@#mp-c>Gr(%B^l3Y=?pl@*U3(?(<~VKY)&!gu98V_aj7y@3`vA!FMEii{9U| zH?9)e({>*RItmI4Ek$@BL_tRwp(E7=9ToM+TnJUDB+I75gz&_L9Qk%~I4^S1Xx;!h z5?dz+(xnm869b{S5}g%`!Q*K90yFAu%jyme0bsmM&YpX31hSUb-z^w(K2o zxoX8qq6fE{=ppzB>#TmJ_1s2&lX3H1f1AH$qlA^-(q<{3O<+Vbf@G$X`{-@hqS1te zpmvVwO07N#6AW>2v3RgFMwhVrLkB_$!qmw61 znml>Rl*v;)y{6BgE)xM=Cej>fcAHs9Xn1)FQ@JSu{>JW}(`L<`J8!n<_*X_U|IrFR zhCTQEpa1*<3AwE^<8?42c`tfo z<5VBOYS#95EeY?QR{3Bwo?FNJ@koI-ZsIocAn3gSOQ01i+KpSJpf({9 z@mUV%k(-Z%MS4YuxSg-)ouj1{G@1-*UJDD;=|b^HP-0U2)~&j@T^T!JK6X~Ye5AG@ zM-0|%yOqWpGH$X|M-S$qFgJv0V=O)+^Fc2>p%sWt0aF7E1u&xiXW~ZkM-3Ojjhr-d zdR>}(!g^QV@#Y3ib8e*P*ixhx+z^LY5x$s*N<;X;w};#xY(wlqPIjL(VZtPU z!F?*c#|+a<+pIPW7@p!()s)G$N!_P<%|s|O$BU-;#!s0(Yj*R91xXIXD=&=r3mK02 zn7U~O41HQ&nGB3Czh;f{sMTU9m+B^Mh#05QrY3?I(mCOR`^8I_uUs~g>$vs61^qwZ(uXPjE=PEnV7NV5G`?WWkz^dSZHuE?a7LW zY=s%M${4SCizPrZa0)ZB6lUmxC_=GshKj&TAtTdUGGo2W3<(djSXhukR-;yD)&1aL zMxYZjlF~#>8mqRm_pXlB;2-&;zHPK7A|^(GMmbWU**W$i35!zzjhl+w=;?@40ygbW@O~HZCTqgGgDJ_ zy72Izpcq|ZQi48iB}2z9LPwShI?__gB4Q3=2M6GhV#xRfwnL0U%P#A|XRD1^`ePm7 zK{;NhENLS$LchrHFkbxi0+-d8UZ3V}Xkv$rdhg#@-+~=!dDaxJRd#SJ=V2RsYsdq} z4)ef!11w;NwI8*%HnF3p!Vb|vj)4wx^m}U9i{od`o#i=h%w(Aya)K1(m@G^ZCaNY) z6+G2m)227hu+0QD$Y=0VZRjkcUi$fSr=cSa;mr&n!_zg%;f#z~3No+_KuL0J2ysD% z$mVJ+a25_+NN26`DgYJrcNj6BXJNPy2p7WT--V0A2lfoBVz|(S2X1uC{wo#(EoDpJ zUbtZ9q){&n8-UD4!+#EoUnwl$kzRqQq=6ZXJ+&+qN>K@5k*>fZ zHbWWt*9AJmg5G`^nY~+#ZHVJOsCM{^^@2fyzaUmv9jvIq`=w`PRy<~i_m9J}AUP9? zje_|1Q|&0HS-gF<=q~+9-+tGQ)L>n(pO4{FvGmchQp#(jE4(N{QI);u4qn_+OooSp z7lE7Cvre)mUeHpfFJUmGn9k@!)f*CHqVk9S~8?K)&M z#0_{_Xp;ng!Ed<}cpZ2W&Ub!8~IH$5E2yoFpv z!MeO42Oi{@vMbM5hnx#+?#)y+1LcJAUWU8m=B~4RJN7B?h%{E;%%}azCu}$fSkzZhC zju-mI#!sCt!l*c5g)JGOp*_WkU=InUK9(w2d3V*C-@u9)0Smgnh$s974md%?a@od^ za`u`HH5WTiMD()?7}ukYRU2w80{Y}x!b1*QzWn@?<1$n7VL@6j|1+jkQ#H1W z*tuhuCwc=aFN_#I>|a5}Ahr1>N2kmAr&+Q|ZZ%nR2j1!KHgIlM&3(zWYn8F4P+<)< zZ(P9>ZbTc-`=7Ek=@2Z_COTRWTjcmvSXMXri6JCcX}cSVT`cRwu#@& z0WantKF}I)XNx&d2;u_GTdZ3e18jk9g2ThLPM*XGI8lvQp4}muNTW5xJCWui2Wi*> zf>e+OOL7I+ko@#GUiUMefRtD(J%UZ7uUHBd&1CGIHhUEb5JMEhN-zp(3UiDgjaz^M z8j&^6w|#wGcyrKX6`PUxAkd`ApxJFYA!hRcjbFGOG&%=p8t`xPQ}oHG2Y4fy_NWqQ zs6a#M)dxdrfforynp&h+ZHif8MH*TyUuqp&Ym|LZDMw= zV5V=1*YxRLQzlKCIB~*+iIb)ve=2xdy{w*+7dK5nkE)laZK^ayoXWs5ckZmIpwalL zXkl$Lo#j-yr>WcHx4`nwyEK6Fo)cIO9i`<(7{8%8U@KZl2`p$WWvfYOVUdVlFwg`e zz}9PLQIm1If}T_>@*x%lEH(xf9&3y2VEOi&uNAO#t}4slmXhEC77@*dPGFh*$_r2b zmu97!nH9cs$F2a&)1c{d!}|B^*7>)}FFPgm8UHhPBvpNpEkadPZ9U&%3DU}l zS&wvy7^}{yVCfPCF;v(!p)1uCpiU#inDxC9WWwk{7&e9@uO^9{`SOf)`Mb!>s6ISW z%@EV(eZ!tjv;^F8z^37mEBPgg;-33DL3i2#7=PMj#sGuu$XNi)?yCBubuo?lU-S=G z?F!Wf`K|F;zXffnWgVOFg0=e0$n3;SFpSJS#mLwTG?ZmUPb#vk%BVk!4Wgs}fg>r! zw1bb)>tf?|{%z(^r!iulj+9)bT^WRz)ku@L;T<5D7;Zh87!DDSgf18}QY6@xwoTeC z(c^g0ZmB`~MA4w$6t2Hf(Y8#l3C3Cq)rz@7f)t7Owh+T%wpl7_6BHI2%@FkJPK@rz zo+sF{y}nNd`wKzyM{7Yo`XkWc|L9iqKt&totAR3OkJ8DXMy7p zqdPL5(%2Dgc*GRpqrRvHD^o|59-=x9tKp;{V}55>enWa=ntNuDD~4WM8%~|9&VC2a z3?q*M3>73BcAV6iP6*jTR;S~B8ySOQkuSD0D7PM=*$u{^pB)Ucfj~7wt;3|D_lMLE zwz3hO`vc7VtxCE@p^yLyHTL)g6e0$(0x{MRP@;uFXwn=8A(m)?xfwft!jx$<2twjS zX@dJiw4#AG(i8#J9v;o`YELhas0~OomA=3uJ?k|CJ@YdskA3A8pon5B1x1cUYEB+U zDeo*@wi4~k-tWEpE;`TT(CH9H0b8I*VEYKf3+juPE}=d33T;UefuifMIdVgZ>5>Jx zS(`ElXhTb?z*eZCs`K4RBxi|5Cz#1;$s!1ovFL5tNZ-|+l*4vK&gUVv9a}WoZ^Gr0V#h2&ln{* z7b`d{Dn#D5i25-Ym18YZ7Zao!Vj7Tgc_dP!)5ZAutiu}C7L-bH4!3GpdZuTS z2@2edxgEI_gh5Grm)iG8&X5O^wzj9#Oz_-=Z!KSe4SMKKBMY<=i~^!CF(V^N1fZ;& z-HF98K(+wembU&;aUuA3F-5v*+V5D zEL6|Hv`z*S#-%F&CUvqu9#XYx+C`NBNCp{5`)+aWr8X_&Zzr^`69I0 z%cW)XvHAK?dkQ_l?rMwh211N``jLwlFIX<#yr9}uP@ir}bI%TTWzws@VGbtYy=vOD zQn<4b`59u8L1q%4EoMD--0wXwDKVaylz;#%%Zdmrw+?u`&Y<**14{fb^HAe3VW>1r zz$QguXbrN#{1B=}W6#^b`^e~6P)9OT4A$E@8*BohEQrB)5bDV%J(MbvE1^6o6^#8$ z=zT+pSteA+N$8dJoQjeX8tf-eHc#n*dJ@vYl-ijpOlePFp(2wPqOW$-C!&Njb_yEo zJ>92_d->07+oOH|0j+zaNNf}u->8cPv5!nCdH;bvHLq;vUZT`j|2%n8!1#^@y@xb8 zC{i96cyxyQBCc2T)-V6Y5D8Hc4o@WM;6UK6>Pj0W0dEXZs$%6Hm5NV0Ccs zupQ+EWSk;`Hu_@2`*(ZK4Lo^<$kx{ z!c>xfk`tz?CGH!Pc_p-={?jG_YBg|F+^1$>YD5i4<}zqVehN=c(3qhdut`29pEz$& zYUg&M6f%!U4nr8c1F=F6L~i3^?iS5{ZS(}qTSYa z+F6+x78S78+h=0{76iB86mwG_(uNhdsXE0?^_J5@RC;2Ka%@BoNpi(ZeFHNk#yp}& z^*BB*de*yCO%%}>CoStlPHN@5@6jSzU}_y6o|f?Jw1jMsh@`O?U=5T~rQPkLBLAPY z^MH%$&f5PBVDC}XDA*fz9UJzB6-7uy=^{5VwN&*PQ%kd8 z5M^fPSo0PFlk@6Ifu`E1-&o_Rn}jC1jllX&nBHNseF5Y$$cX>n(OW$zPaY&zck@ftc zhX7NEa#CF;09Tl;W5IA3twa4bXW0s>-)193!DG%W#5rLw2H5eS@{RU=L@@DlxVc7P z2^0N`XjFdzRFq||fE0y!^A|1g#4xY>gb7n-&jY9CdCZtJW|-4Z`o&qXWED@7XFd~4 z(J6VQHY^d9u$7FNeeOpS$i)3@kt#X?o$8I-$pXsl#v2KvTa? z^=SFXBTDSK78(}fCvh#efos+hu?}3zChg@KB5^GOZnqfJ5Q^Teat^pwR2f?f=_O(f zyF*nWW~RJ&*iT}0cn^14&l1%P`5g-rHPIs0($ffQ`4&o%*kASdm_GUuVXXuv{WkCQ zTYLjx*GCf8x>1p+V{SJUi6tearB<#zVO(>y(_gGR*4TsMaf4CRU!7xOceINN(4J5#%d0P4I(6#A39kB! zdVRgQno|p(w>SZ;g@=n+vy)tvrgF!0WJ^5^YZ=*OKInLlMi*99Pg|H6j}nk^;rd@T5eclsx4b5QLRllqZ$^d3l8WY zxRUDuwpbBtrmT*cpZP4Z=h`7Y(~==Cig~D#MP6fI`@;q{Bfy4A5K!acM+t);F{oLv z!uThkRtHb2zE2BUHbSetCr1%eJG4vu7iXs@;@j}uWd#!7HWJ_7SSj+20%F7x zamie$t^vJWF<8x37PnIE8yP{6^VQRmP>o#ojhkQdAuT8<>JP-x}m>*W!>?kceK*8xH1;@q? z+3=8Lw{P+B6Dv)!hR!en*Ge530WWObE41g<29%SGu#Ye<)JZHdfjM;keSEfW_x0uc zIDa8Us1nkI>}KJZM<}n}Re!%;IEsQ*3sncj)^4+ewv4p$!16M4xkGkjm?6{v(bha7 zE!|K%eOW0>-Ss(-((3XElr-Q+jtWR=GkJ46>!6jsxvpRed zJY9ra42sD_%_m$Ymmx0;t5H=mwB5F$jY%NrH6wJJ0JF;g#61M!>IcaNaRa#lmi`os zWx$Sh9U>u2eVX^Sr3F9Hx;LOHICaJ|F{(IJZgSoS20ra?S|Gi9^lAIR3Ky%2o3fhpS|Q zp|%9(9s_OW>$H4n{>5C~5=#@9cSc%-9;9=)bn&9;g2T@jB-&wz6C;a^c4u3jKKXA( zyZu8O(+-|IqupCJ+P%EgW2$2KK%yO85kN5K|BQCGoy}d^cka@i1#`Mj7(E!9RnJFV zE2iZHVRt_RFLZ-JCYo`{K#9mW_~b1}%@ z2j)L|i)`pgELXY63ryB^SI3a7^Ih@U%6Hzy00T@lsaVCJ(}orsA?dcTDJOXTeh#qI zIFzgHccl0c=q_D4d-lYMY6iSk-yc=0NzRd&lZZ#5T;&0!Af7xs@o}grthq8Bxcd~i zbKLcLS(%X>{aJC1fR~h$&(z!!zYp78-kV|PTc?|-smMqD$%t2ha_I8S zOY(0HJWMsEI2EWy*%Pk|Vv23V3#Nmt#U;6icpW;6$p#QlB@$1b&yW|{fIJP5XUXI< zn0NG7EA+xuw^c?4lG;DST?5(MN<&h=FFZo$BfccnAaA?>%xVL zX_tfH&S9PhwE^b0UbF0E9xG!_ zUFFmJ@?9N!9u#s-U7wg`UH^i6qDRMh8=>)tduAr^v{vYGg~B0*y`Wv@SR_F}O<2LV zDFK6;Ladxb9+`Bq$|pAPJ@%7p3kZC!X^|56*r2Bsd`jhHfUl?+;5#g7ynWi@5)ph4 zmA6=<^Ddf=z+Q!xLm%*k{NhASY6JF?wS{!b`jcIckC~(It83I9tIFeplsh)8+u-9* zmmQwA`heA#s5ossW|r1Q*n6>WGpGwL=_5SX|SD*1Fj02zFAAGInnR-;<^ z4;aU*F*jpVc|Z(Vbemz(Ve!ldlbz6byg#A{BZO?n@Tl_g?E1U)yxK{bcJd?&)kdr< z1nV4&;&arzPUdUQF^A&7IFKErE&q;5JWH8{F)vDDo^(2}ppY@|7Dg$!NJJ;v)vq)S zzD;Zxi1Y2#z^ozS?J1Io_wC`DRC9_`VN7Gczh2_Pczm|MB;JC*dTQ`jnv)K#G5{KrpH2wc!)Pex(>WL^a?PuwO|q8Hjj{p znw1Cj+JSK*^^kKqAG;?qhP-Yh@&Lkl)5eb-JAU%iDfl7h&2%5#gnBFlZ1fn#gekKC zy;q(GJ(dB6VGAb)JrkgZ1_IVkc$Rr;1)d2)&xyjnAoXO`1U(bPUIX+n;za>HSB)_3 zgiA7PrV#VY81q7H47uk-L+Uo_Aq?#Bfe}^Zg;^hOT=jj6X%tZo_g#xcFu3+3(q zLh$|S{6ZJ!9({+5!O^HmV~6$u_By?QJXEgZFHNf34$yW4HnQ&|$=6CE-_?Gf@Q+#> zghxZr)Uisw(}GNA@g15Y>}T#BBi{{xu(9H+^*ziK-woe5rM{sr@ja_;`5Twr6!~XCx^j)WeQCHVdg}%{Y|CVy#Y#U&Dl7faPc3a`r5_wMw$d+-ui~E#{Z!I@ z7+yu5si^z-$cr@V&f2Mcj)z#Vccj^UoGbL7ID$BVFp)m)u!NC?4nw$uDcVXrTS%^7Q011_mLE3#H z2~A}@BVkx$66O~%68^^2UmtOpgEByD;tyl{(rCLV{xIPS6lPm+nhE0X-$x##T2h>L z#x+Lag7+Ix7)vPJS(1I&qBA915dYDD!b*n1LP8;puQC)KG-WzuRDy)OM8bO#3FR^v zc^qJf4Voc$+4eu3pfID#HAD89`#)f^&!M+#&)Oa)9C7=zr?H2rhrsv;8}C{Cn=uvF zYKVU`XUv|5IgKTY=5rpx-1ZQBo=ZGgU=T(;z`D+8KG@TbcJt<$F?iNxG1l=saC!pk zbyG3o(Ug7TS+o$P3ym5*)*gP=TX|xIn_pJ7{|JL0lY7{uF_8(!*hhKK0_t3=*t1+U zQJbQ=4%9QD#1$a*%xG9pEE(K9!xb6E&l;d-KCf>IJ#i&Zf?g`17r1@nhxSrWgx*{K zchI}x+^K7izHY=kcN_CKq^~w*UVFpb#pkd347n?;nS1{HG||yxRW3ep^*5hyg}}Lw zhNJ^|>37M|J0m#M`j+su!%BQ>F&c6s8cNSscc;PAyLvT*d3yJKtL~RT_X$d}{OqSj z(6;b0cWu6w`*{?oXLz2icQ5{Nf{;vGfz-eFWrGEZPqUtf;={O=2BzK)C0*&`H1dor z6D{gW=nJd>`qB&R(DzQ!Zb|oX%-oYz*4cDlEznoY(6^KB{Kmz`AR`V7J~rJK2Hm%% zpa8n>kc7S?Wx17H67@bl=5UItma*?Hj;L~AA1?nxmM zBz*K;^&@qM$~_UWJ2tM{=tF%BoXfF9JE%qJ_dNK?q@owQK2-FE&|WbO)ROeWCY`9A zeuQ=sqKBvx64Fy*BVS@e`$WEXuoCzo(8uh(26N93$n($6uByt;j#QPGCld0GHdAJ? zD6|TD;pd-PiXyjC^GMgmPg7ZmDYl5vl;UGd^BKyzl%mY_Zw$JE;<{3YG>z&8G#?+? z8^35ObJ-RT8xo-@eKrC^&Lp)go)G8`rAVOr_LKXmT#8e1LSxX)d(Ypd`BEj&9Wv|8 z$@ou_qc(WoVy5{R=!y%hpi`6Pt2AcHcY$-9#JN8kIA;Rq3`431BWV#%o&YBgoWl^U zx&M7Iu6ZByE6|pxL0$WY3lFttV6m>)7Q_r2&SSU=begO0(1~-sR(LI(Id#U|h4UB8 zn=@%(TZFD2^D!v05KURnr7Q($oPq#1b=EwHJNuHB zP1BBi8gRCV0$j%kP^SQJ$d#sqR|1^noEdntNOzRZ4A)1>G^0ILH^zUQqS3; zZPHjbNzQSdgeJ|3M?$;1ANK3F;;JC5StB-M(W?;2hGy)LK*Q;N-wFr&{U*fpi;>8- z-}eqL47-VbMFv{1Alq@@L~6&PSs}#5+1jzk1AHqW>LB}WVCKX&xJ&I=Q&*?8oJok$ zKd&uIRFfy?G&CzL-X;{XBGy`IVgqoE16T_stQAREGj23*l8ac|Nm%m>4Zy%>_?x8- zSR)@#R#|Vu+9P1Clwqy-*;orDtmQMT-NHd)D7wQE)`~=|J+@)ZLXxgbYbfYYmZ(V) z7o8iJR`K|lfMbHSYC+jn9UbnyVatx7P$if~v1=%2EhTNAjkIqNi%)t^oR7m)Y;d42 zmXX$xjb|t4E=zK*H*CB(<>IYt-j>uHCQb-xVlfLb$I;j>v+#KT)_ytR+7p*9{rF>b zHBqg__eY6prR8QD)zCvJ_t#pfCWN#~tVGs#1J(3p*qGnW7$hyi->NE5SoB!$2rJO z!9kz-7$0fJ;I?EjB|bvH(N;iPxOj+C5IYo@IdMTPi+0B1#Y+&$f=29k;@ebAt2~Qu zqZ!|<)hn~??D-Zb@=Z*zW&#e$D{RyjgtJb-$zYd?ZXJ#4(mpg_{U<0#*G%Qt5UF6s z=74~D)nLOL)vGvojAm>*s)v67-7v5F*^z@I_EZ$&$nkUOw(=FPdDF)I-_WhSB-})g zuFDH1RI1gDD%CrJe2wxT#MnVW9#`;Ckbk9oEbS+KZ(!4IV@+KhR_m2@&{mjvJ2CdD znYX*~PZH#N4~l&RQdeeRNP~P4Qdh0A3ou@eR)KN{FqBuuFjVlVX`@NPP<9Fag|}kp z)m?=)bw#e49%W_Cb^{ux1fdEBAv&x~+A2zEzYnPl0fe^ZW<83NA2|AlNTGujx)Kss zB?w%=ko;pfYhqz(CJL2E6w=u!glITJk;Ad_PoEt7LtO_?ts)_qJT*II#XXIoq+%*7 zSv%q1Ojk(|3JaxP0)n29^W;ap5+)XWOjJB6px8Tec8Ahw3bApS&T*tB^psZiS20yBV@!8 zj9{h_jO24Y`1#GL#lUdo0Jn`>?CiM|rwkX)nmmD_2#eP9XQF$6U+5qQ);&NiiTFt> zB}a`>Oq@DvKDq~u(xB)N*|Sh2`_YJgDUSvMH4Zp54n!0omsUa%0QBfuJxa+sl#v_* zkqJ4J)@FeTVfv)AxF3ZdS~uoUQFhv2aOhQ$Lw)|&D$DHru#3UD9r7m!qljcI>fYIi zrR(c|fg%`JS3~yyZrckufxUnePwxeY@HtF|mRQ=Ez0J@-R`?VHKF~MHjRc=^5k84_ z@F})~k5`2iJ{FXA&_KKNHVyO;_}RtqQ)R^urRoP*vm2B_grBTN_&HFaD1?VfL}^xjBz7HT@?W|5h-iOekCr`dL*52n(Z`{hTH zk0qQCK%hVBn-PHW2tdAe07|g}s6|3aNO*wC4nW&yt!)4hs#gY}4#|Phn#4o~at5KB zQGdYB7sQAL2q4kKTE7AF|CH?_mZStB)AJy-+#W&>v(_NM7F`G>hJB-RNdXn-95m?A zz{Gka6p#oZBM_vK^bain#A*{I1eqiRJ&+L8N;YiR(4lVVUZNGq53^tnVhCbyp@$5t zr-|O?5W`@@Aj2TbKsqfX8)U*gvqu1trEjx7teyF|r{Kc%yaqKyXAwmpSx6hX2(AK2 zBgUe+UQkA};B6skj#>DUw`G>9KE@)9;2Kc}wt|0;ENvR>u*|gs(NchDB7tby4BSC$ z3?c`Bh#NVE76Rzv>fhkdxgSuUodbqAMBvI8ip0GD;Swc2T&5PLD2nb~`x6*~#|159 zz!v3WtY;gU4&u+X{o!mA_~fJ|#VDUs;;oe6)7u5>68|g9-i#f}+Ric&K)nZznmBdp z#L+`AsPW$bgzbPkzPjJo4&_+dp*(TleE)>^*r#?V8G?@PzH4)rOhAwZ>5NSOr!tsB zBYqYC%p_1>HEbncbQIrW)3HRL51~2`0Kq24Ffisz(;^ra%XSPsQeJJY4=4H@k3V@b zvlR4EmWuKxGffwtU&&YS<;|)Rb-MU?vs#E3v_@UC%8KwDhGBbkgJ-h$x>$7uNBX3W*Q4RM1Yk`Enb8O{$gphV+`=#ky8$FQt0 z2C9GYG9B;WDre{En5r*c`T$OikOB4gIIMo*V^alteV$+!Lva$W#Tx1Xga1d7BmLYXi`Kt^FfVB?YAjz=^gD`263EGJs%W<^;Mcof@| zN2^xSlJ6RF)5W5U0?YqbJhC9Is>>Q@+8q@y;m543x539?4jtlT1IvbCK{3(*mGK9j{{6?A>27EI6&;^ zF;m;RcO(j+UTly{ zBJOlCnU&^>W>pC~-RGYJKcCA_5PuRYGa^O)94G#S&%(7=EEriMXp&hWmgyfK%|*3Q zMXI8$YKV{iBT5Xr>p^Z1>*yhlhRv@wH1ue+L1@gN&n#&VQk@zhh@a-Xsv%uBLL$(< z)MSGWllfTDc8E#$wi4*zE@M_Z0+6_NRM-F@0|0auDG?7P05y}17%_bKFj7LY;rd~~ zj&Z07e<5Ho(lW%1#mL8qtKo;3por+ME8m|Eh#31h_J#k=yZqsL)1{UvAI^0&O|15F zW6benx(CbwXFRNq5Jg7JL3)JL)SEp=-xxT!V%A9eESf!aB96&Vc?NPE2|4^IH-;Sd zX|oqBMG^L1GVHYN?mBSvgvpb|an6FLxTK#SQm{7F6u@> zDg3O$*?{Q2>cqrYP53gbT0rbj2hCP(v4K%|J-lCw*tp2ZtcddRM-4(Ji#U^=W93Y0 zYQZPw3dbX*I$gcm2~r2~7`kT4?D%l}lVd3U3t;B3cGfHQn9(KY!DsHC=cf*ejZIG0 zXyW3cRer%y2<>Hc*DZz`$Q>F1LmthxO&e%EoUL8kmt7D$$F+1bvVN zvvm0~@J8&fc}Toj3QGq&K66@&yje&?^7V6tIf6%vc}(BXwbmxMnKN|~Q#iBcFD8ZK z2JT6oPZQkCS+Mk_*WP#@Zoc~Vo4H(rR*&{zW8`F6 zkwaHomD_=w?QtSSlZJd?tb? zc1uH%1@IvMo0(o z7&jaz34t8LP@{w$8fCJo91cNzG`&vPG4^8(ew0y`UiT&H2pC`I@FBSLCZ&VjoTV#> zJk#f3Z5p^?N@p1(4?m|J8{S;vxp1Bb)m8?urxm7^=2LCez#e|F;MryAGOwkJ=1z0R z7UIfX}Li`0x*Kza)nB_KzO_>ffi%py{Otd2lS+rgZp= zPLj}h7I=P#>1+=kC?f_QBg@T_p`|aJZFS~*5j;mf9wC7z;wkW8J7>+?tC{8VKL(G` z)dAqKbQ7`jM`w!68aQH{`;Xua#`MB6*6FD{THssnvjhRzmV-Ah&Z3A(zJmQft%K17tlH^^uz`o|56<* ztJ1}?ibf@~)6X;Lw3eWQaICEzD0hbC)rlepQ<9`|c(qHc#^()`%WMyjriAeQXgm_g z5hYGctV)#?P+opVlsG4l(ZE_+nTZXwi8&71914fLQ_FGjS?3fQ>xZc-N#5+unuVi^ zKus=k8q!iz2sN_u`qEzc`~3aG!hiv|-}pmRlrAJBC@2sq84NdKMTPT^G%b$*|HKv- z{voWho|qewp`zlV~rEsx8{QoMatS+qO0tN zL<4v^5^PqjS`9A;V`A6^`~ZQUF{yc_D6F0Z8~$gSBYHM$c+^xkFh}%vQ1jilU;h)) zv*EUn}^V`Lyn(6nK)sU{?A6v4m_cOQG^_vX(i;y_kcN%%k>rVkF(4+1Ni}C&S7GX zi>#AZZUJ+4L{nwu5Wka{le0&~B?-wg3@DnFMjLdVFzBSybpi=G+N9?Q9bVmD zmFA~H%GG8PI&7M!_OFzJww4fWd*5sT~=QS01c zTBnByAFLx|KAX8Y(rzAr<$$S0`ey-ruAsj9%#cX@6ihTCLj>ZV^mo!G3kR7Y`8^lvGHe^jXx}g&x7&DbIB4f9D8K^QB0gXZT7U${tJ255PANKp~E4@f@irrJ=%7E zv8QX_!9)7Hyod>S8+l~iEGVv=aFwk~7X$dicQ)Jj)8Hi=JKV$J6m$DW?JRb|GMO0l z2^X4{T7Sgrsnoh}6FqhWD%M)!TVj;Z2LLKl*#U^(STAXwL4b^&&ii9xt}1O_3*i8|?2Y&l|*=hM1l%-|8!?el|TLN>Dut8gWol73_dA=GH_ zlS%mSrOnI4C6V9NvKTQ8p}j;RtEJp#3$u8{D&;c1a^0fUh;qXa7L}C@s7JKp|hiM*gxm{vVaJyhkU+c1 z;n|h>3=mb;m$u8?6YLvBy??5M5Qff2w2KN4j|}$e)dv z-(Z&$8=mH)--_`1vUL(Sue6 zv^g+=9A)f?KmiejKF+GasXKC%A1a?n3dlh=ZXB+nN79bF8XI57nbtZ=^ztnA5__91E3M`U3gBU_0W3lH`f8C(iyo zCOA8gJcp7kAkG7f4N}jXdzv_~b{cjvlp8=C{}_olDdixJQ_?;iy?~vyC@FQ!jMUrQSpT)l! zHLj|w?RayLc#|I3gg5_$;8Cm1^&C>Bo;Y|>r|t3c#bD6ma3QpP zcxGmHq_3|sMwC3*OJUPI&LU};xq~zU>nx98Bh8gd4*xlpWk`FR+A1^Br!i-cZQh78 zMa2b~J0;GvBF-daY}pYKc_B(3XC+O0it-eXDG+J$Oh8R>jjC2f!BP*Ebv9dh5;svc zo*yTS<;U>&5Jt;KLHo$5q4g&%szL71th0b{&pL@aPau0NSm2QN>BYOs70v+tUw*ptL%aIFhoJ-c_ifWVdT#;67sF6;l2!VI zgcTGs>7y@j+!wrYW8Efs@*#68gXbnI21%?k3)RMp0l4gY4?i|Dk>ldnVH8-5PC$VSMp9H7*y6o^!(E%dhV#@ zl_l+h!$Y>NU%zFC82e<2eqdER74{6`%B1O?+cpHfAR!XhqMrQxvU5{Y)n8m{5IYBt0X~U4MED?&Glhwr6A1(#MBJ%c9EZc4 ztzlRW?sTjyr6iOVS-V5y2`*2Oo5-Zj9RP@r z>`dQB@_T5AXUleg6!KRoL^z`2iUNO59nI0FJxOhq9XAgCdK-bJa#Nfp zyHA=p!7{$Xgz@9YjZ=&rGkWx>kt5MnuNi7!_OcwKhC}GwtsV?ALj%#Sg>isUkIM~^LR!wwakkhHv|k%9?ogyq^qiE(q*Q(c1OM=rY=?q(}&IPFaVL)?87XdW_gj6U~Y$?eT1N-jf9~5 zoGi>cJ{v**M5*Oib-cXX2neOmnw`%4W|BXMa8J(NDX%Ey%FLzBvdaOXa3iwL9l}CG z`H+sGP?e!-_4e%%abll~kG{t^)JfzJO*OMY9t;z<#zKfV)vUUF6&U(7zdo%F7>eA{ z7(*|4Bgb6wd?XCzlt>tAt4&r%B_$70qDmrB zX^rY3NJN7?dYkcVndLZh`m`zhWWimS)PayRVLYP|?C25bw^QHU04L}PMxEtu&_+f! z+4GR~yi5axfig_@2m`qO=6-x%NA%qB)g$!!)wSNm0s=98gxxQ*ixV2}_-b-R8DeA7 zOw8!OTP7yWo$m=I;V)5^&7;sw(H7!aQb|h>E0U0Oj+i>+abg3^hNPt;k|raP3F)2_ zMhtNzBq0oWs9l*R5ef4?VwolqY5lg~*wljZJqM2-{~F=v=z-Cgv-xKlb(YFBiAa=5 zVn#NJ0SZYZ68B4eBZb6+NZd1tbfEJdG~KcD)zEaud=J06vqYpdAku;vQjJ#kY#zz5 z$U=K`&!G|Zz4$IB3>ON{macMV2}=Ekk8^h)JFK4sB_p=>2}=47cmE!g_A3cW;$}s? zw+zCFK`Am<6h_#I4ao@(Jt_`|q<67)iV6lrL9JFjzp9yR-butA7+#QFS?XKM;meO{EMBg9}3|UsRv*k?nz{&=3s$Akmx*>DE5}6#a`rGqU>XCC4*|3sMP6 zEyMih+Bd+Qms5hd#H6$wF%VN^(v#%2Nx{((Q88=O+Kt5xHgSae*e%c(pEYyFv}xw4PE#gN91m~EaV!K9KT;UcjKDN}SUsS` z51~vs8G*?Ri6p~Tm<1mw+y)s2It)Ur9KdAg*Q{@Ea0wQ**_H2g*HzEZMCAspr9wBk z(mffl3FARv6ISnETDEBB^jToj5*h)rvB?9emRZ@l$5bU$S%oN;oTMzKRBRu_a&A1`n8%SlFtouV0Z6cXupi*n+F6f+fdlAB_8}H0@ZQI?Y|8T`5 z1S$1(>E_I#tTT7|wPSsUM}K2D=w`ezLB3yEV{@#DPMY<4@6+B68zM_ZJZ%aL36IK? z@C5(p@g}()o&3bAZ42wsR~TU)F~!8&+0_kj+N)*f7Gk232~I)M#zn+?fRnO5jx4Ie zGd4Euv$E+rvyC1wHtnLb3Y`i|65|rY_)0s)#NZ^4|NMd4NfjQg3T@@Rk!~$eADhEM zd?VE)(y7Eory9`7z-FJjOLPkM-?mX)J7wK%6m3EzE?h>9fbAVk$|){k!@76gWsrLB zy$?j^$SRy*jrohtksYRrkDDvoWxV?wNXfsqQYt7?q||5Tat@S21xMn^j#5SP!cs~z zYMxf^tH$vvbEpBQNpeN5su2DUZSY?!0NYCC=aEw0jxbZ;|I#r67~c_IQ! z2w`JH60VRF0$K?@-CT)Q%U%YprZFW2n+fr6th$4!g0qdBOWNF6fQy~T{e|PyPLfg! z7B5+Xy;go$OP!?_XS&4#CN1zG#i zhu*+ddLvv37@4*-6;!OvkL^{;e-n{)|61*J?iz<0PgGPKb~RAl0a-ls6n+4VPCpY` zh88gX!@)Y-RA-@=ms*j9*V57DZe`C zK9Q`!yZQLmns`|A>nH_1z7boCtC;e`I$MCm)~&1;m{}^q)$x#ao1HUn@|S1qW6Ez2 zRv%bgQc@$hzCGD}VHAUF;!Yb}_v|-+EZ?O?dkfl6E^pfa8$i}P0X8+c0kDs3fbC(Ge{ArQ?SwI3o$4JiPb&lcb zd%uSC+k4DV-leQW(}=0qr_Cvn=av}CnwK6v5s(-jR)_F7J`{J=!kdNSHhoZ#C9r)+ zSY&uOl$|OD^cR`RN4BP-ltwSn2Nc$|BBauD@yk!YTyp&BtlE!| zN?GVuq$Xq#Qj3eMNbQ)Ow06Ue&}g;loiO!Bn|y;Ks-xsF@W$kak6E($tWJdHgd&0 z66~C~Ibj!WsGFl3wsQ4@3{Zgeh!_?IQVLVE0sZ^+>)Y2tZ0!TKT3qXT-2+>xLKVMYEq+x8HacYoR!eVFAB!zH9WgHetH7Qtt_K3GK+_gIT>3x^_JYuszu3LLn_x#) zlQZLLx9;7$b???yX>2uC9aw}{r(KDwk*4T>(he`=9VSH$P>xkA>E%nYnt-@YTN58*Jl6w^yQm( zuARAh{kJPu?*8$xuKtPer|0jxzrJ<%#?9ORIeqQ&#q(EBM^zj+Sd^w!hXih3|K8dU z-hJoYcUG@_Y4PmoGiFYoJZbQR*KlAsJUTujzijWJZ+@xcEryu6ei;knbnu|&ofY(g zT%j=wf_J9icusNdsj&+Qv=40}Rs`)CZ()Nx1f*@nNV}d$+t37sh%Ijl+RE(=v>5>H z<8mYBCmCqP)?0i+}+sFsPUPxauvVYWere^^kd(iZE#cC^)(cP@#y!IsifFjoTDW|Zj5oIcS8Bm%Rt5EDK)n12GWOCL^{{$RFX=ScY8>|&mTCrbH=w(LSVabHpF0LEqL?LJ;lLvBZRDUwyK2%zP zi+$q7PBZ`knP|p#-E4kl=NZ%C3Ql&P2se<~ftZGe56HVY4#9yj3sDPc2uO2>a;+IG zL;Q+-&_MGbG$;7}@_s;VD?%;JX!HVZO}%c}a4YXgxyA@&addI*1>jm-h7xU&2(@ex zGCe&OFI?y`8%uv4$YaM8Dsh)+yKLD~Pj-igpXW${o;0kAT&Q^q2*h4E$g{}2K(>fq zjJbF;DLkf595ZVCbdYrUB0JVP3>`k)VkIrjbu=OES|Y6`qv+YBrL`Q%6lA0ouGX=N z`#vh}dQg^QTR8Q&HO51_8X0AgllQZLfqENhPh;iy>o1>A+RksST1Ba3t07?*&Xhbs z3p_znUl|-$p^wnpg5Oc1t%b>0Gv>u)2oG%06Q~{3+XbwZz1V=-$FKzD&RtDd$>F;R zUE6ne={I!jB=@ny2e@`~?%ai^`BhZih7S7ndb>&0THznMpU(XFpA(0-efLCf)*JMO zhj)IvR(gWQ;mHUKtb_8$;6z%J6_>)h4fh zyq|vRyB~i!|JA7rzx;9i>h2G(cGxlCQcjo+0`#wH(^50+m@Lf>Jp*@A^ ziE+wsl2!oinzvT|%uzb()EA_lth?uf2Yt5Vao3?LQ zjw@#Oc!h(z|GnFS!?h3YnH#`cN8nY|a)QHdh4+2I;hy3E2Pk`A7aY75`JCWra95l& zKAX$f$-Bx{TQ2b zN<=n09L#HEFgWhgX6-Sm3C_C!XB#BfyMU2LiLtjvdkJ zNL9qg|7xOuE4*w>PNlAl<0ot5k3XsxiJVcE3;nzA6A-yn+l0uv>>_zevA(R+F|B`W zSZJ(WPQrqos`p|Oev9qc@f^5U%?Xj&Qz*elstj}?Hrr}At}9_%i=)gdlHq+k_>JsV=5R! zA^bcUJ}mQvc`pKeAmZ#VP7y5r#QnxV|qh zAsCJfL$C#Pgbl%i+y?b=WeC=H<0Z9ga^|Qd+(ib@lkfII*KUxzXc&XT6DHvGOrbMKcwZ~yu8x%4gbn)zjA zXJ_OV7w;_0r`x5fENx~^UPcbS>{HWHG|>?omalp%=IAe%zTcl;x##nfC;#=&Z@)Wz z_14lGzhBKgeEHu$U#&iL^!$%!zWmQuVMTjOa+2d?!h*MNS^xe!t5?0X>Wx?4STap9 z3dXx)z@*n+d-Wq9RcvxPC4T}-8%2|ZN48aG72s3DKw{!zV3eWj^J=g zaqTGx9|eS8e;UG`fbhQ*e+}UZ24S%aWd-qBZ@vM zFi^}Eq#;3*zl33=H^lU;Xy7oL6J*zllo79k!|{eV6GU?9(;``>ye-)gcfn!#KHTRJ z3Oh8#FjvGi!mtqDLKVGn18qh)ioK}c|B}Lb8-*c|+1`0DTI4o?jMfbwX;R&R7vUzF zz0k-?ua#@pTc-rqVk3)@*ca_6|2Q9|^2Z+=!Pr#UZjn8UD=mO=l^u-Zl5H?flVF@D zWm*u7wSaMl&jI7mkO(B&CnrZlY>elFVDJLHe6V9k5Rq93ZGoOS5jlttY#W@GoE#h+ zYMmau&xq_qS~;{04hV}x-gF#1c05^{mR_4?29YB*jfhOK^;RNhG9nk36p2Lcl9xO! z53|nRK0(UR;2p28`EY|zpz>E6l8xCNQmsUe(F7zUY0E7*4PK+VD-qcu5xKPti&0p_ z#7xY5egTIM2mCd^&>4SEtK#TbO`kSx>f}ii#sSK-ygq^-4i?k7G;FMkST-S;=fR*S z5X(embkO@dfy%vm^SvCPm3dcvuRkOzn~BPRjFU@G7Z(^5OeX`(UJL2=$0BTx;^!nV zQ!X_2ND+~`blGxIC+j`hvX=sAUPua=TiycS3%}Zhq>(+nK;}79#*Z91ex~P3udY}$ z3uG1sISh7#!e?j}h7Ut$3PBlvAI$>xJ_QNQXqsQS!Z9>kezBk{C88NKrqIY74ftH) zFx*^cLoO>`Npp|uKjxD zkGuDO`A)NSxnoE{YHoT_Sy^#WL0)c7L2O|%kd52bIaz5LY4MTKYnQ*fCiClamyTp2 zCqk_X3DqPdXBORBdgtb)oR2Sjd+zeJgGVl$`OoohzV^>6-IboEjSCOnw(%oKWSl5| z^NlyXrjH*#(cOJq|M9QAzH&WW&DeNddfuKh_v!`SU-5pVDzr2*{G+*y&eU>+8IU&JK{tyryLW z^3Q@L3nQlpbKKh9urP|XkjXiebxc|pGC4Jx=v;4QbHm^yV{S?tJMr*5-5EGBX*%nQHZ@CZ3g z3H(ZA=1bd`l|D-$=VTb9F@YDOs9_^ySGuX`vjr-7*Vk7sIh`#_OJ_)K858GguaPNV z-%8{H9gAQrDG-V5oS!Nx+Icg zqIV=DCG4lG==gW%5neZ%VS1?KBr3O%A*_`~6^#qI1+s-40LL$Eh7lnsWqx+YSu>_i zfsFwZgN;~1C=cb3TErneMCL|g-kckUsR151er&_Caezbretmg(#e(ZYj0_kdlTAHM zF3n*MgT?TTMHtiRISIxKBp9P7Gk@-E3bFQDv0}N^w7|NFFt4?!m6>!LMKTqOGF+$hMI2+vCaSbo2%EnOABtW zh(+Tfv#6qxSjKGS^NIZ6njWr&1w?*=!6xA<kKUeQRa{lDEC(oV@FDluk zON>zk2X5K$;k$3cyP@9#&uJ5pdE)NwGWs8Ht=bq67MZBa%-ebJ%pdiF;6L<@h*EWS zjBfG@Bl9G9ppR6=nA zc6y8?*Ym7TLUEHPA%u>LDkENYcb~5_#u+v8r=J9iQWimv!aZDCksbv@QK$TdHv!f# zOp_v0<0m03S{Z;o8N0J0!;5f(BI!!`vUbmT5lm3)ChYWdv%Ltk(qnbAnOLvKOaZys z1L0=JZ+{iOpQO}9Gn>5#5bCj5|Dh1NbM+7PU+PcP->er-%A39k!RRGAmNTs`RO8;% z39T|yd=U=Qi%__^$%~-PLN+>HgfFcxLS(DNy;K%p1Oyl9A=ufQU^TTl|8@bI#O*#2 zqE3&F{u56EA1On~ZYwrrkKpi~^dg+67vWKwCADQj;}>D>JASqoAxnA@^28URTT$w? zV*l+p+OT$`uPQngx3=D9J;a;VH=zn|Le@0fn~>S)O}LFW;RnpM^3t2&BwGeAf?p!{ zTwK4%f?+HH1~2hPaW zgg$4_!LsGcUs~Zs)dij}=S3LdSmrr*%J@;EC(ZGC`BgjzlST~@2DKW(o&&dGBeAbE zj82i_IhbgB4&Htjrk<4KU& zo&*lh0e#p%2;Wh9rd6i1G+%p}E-dKE^b zqN(?vZx2WRCK$O}-+VZA&VpH9OO{R;Gv_1V1kqxau^`<=H}uX<_W)N$h`j2ky&_@vj~d3RGt zXheKcT2}tvQ@44cb=>q1Hl+uLZO!k$-S#RRP+SyL?nnQ%!e978arB87B-_k7*GmR^NxiqKQZ3Uo+c!1LjmFBsepsJ!t<`X7H$ z2gBT?aPbyu@%KmF=?A0FD|Vk+;Vwu&AA1zOz@xO={TdzxmHWAio~!9+Jupy#Dnj~2 zUBpkbTahn#s_5~se)fQ3M)J*PKMHxZQnRyq!xKCV3G1JD)5CxxgPf*iaflx+R)>e+ zUD#bAl?pPADYjjCq_tAOtC88{S+Mpw4fHG&BBtG<=3{#1!=p#qlvnAv?ojb8)&!m4dkHx!H&Q>1oR<@-e0&$V%75$0e-%h^%z#ablcA z^l!HLAi%3)moBut`h5K#`Xl<2&w3KlQ`wVnLK}a)h7J%OkB`VrqY~k}L-pk^ls0`2 zlGO6N3iclCh|7(r(FujZUepGZ!i);RF$nRCd}wo22*H5?0i1u^U}cyxI5JAjZ1g{2 z+Q=e>$X3)EpaLQ7IQAMYl%?@_3b@pkx;P(eabTF<1vet1thGUg^b%x?FG2Uh%xR^R zGqe%q!M31?nD_n>6v=velCgDg>)j`*PTy&3>FM`;YwAZa-z>d&{aWFkOXq(2@ygzVKmO;` z7vG%>$k|hrmlPKj9Jty0{rBHpy=v8)uf6=*(m7MyCygIFWQ1bQt7|^+35`lj$u2BC z^8MY%ypTC*#XL%1i4&%$m`yd1Uo>`}!vDkb2=YZMCn32jmhcd8ev2KFtx75C_e z5fms9@H1L}W{%1RgZoiobv}LbJ^XAM1%5(}qW=LDAkwdo{fsJiJR`!t8veHj6gSb0 zz5U?fXOF@kX&*iLr|{_4cniEFybof#m1l3mId6;fHk9IRK+T}^#oMr_+-f7m#-L`X zw0j(a3g~gDgN?*$hDXx*pc+5+I22hQ2Q&zu@i>Hg;c>_^#TigDRIaXed>VItdL=;fzYkeY) zf7|4VI9^xYso{md_8T&fa@F!o>kAP zA;H9lF7|HP5gOqCkAOGdUAJXNsOmO75&Gk{2ZAoss_B6+X5oO#Bh@YTK0HJ~csTyW z`|gpGZ29tK%Xlwgsjvk58cTQ-3MPE;i@1gSqAqMBpL`wKMIm2*{J60gKWxDsis8f9 z^dUvj3W&hQk#8RPNM;=Va2hli&jrN@Q2M^pzyWw6_};Q!7V?vN-|bc7%F~z}8n85T zD7_R|)P=W?C6Q^f=Fv+*_SM`)OTD}h*EWX^e4|8IikAXwyBL1q<_Ys@@USf#fWh}# zwgT^j8LtFJzL$6{o-=jgSj@kyc;z*EB}T*On&ie_i6LUyK$Qa?iV0%v@Wz{~sdjkA zLqWli)OR(Vm;a1+!h+lq=I!%W`CsJt7YkK`?D~!C20RmYZ50E?UoJJjeCg6f4tgcHmBK2A#*f6}+0T9?#HxXlss`HQX-z|$ zy$1{&fB_h+qP)m8dLjhi-wY>7z~g|MXuSuI95-RKTfd&&yLRbJPlMwNojc=Y;F!Vx zpz-Ta{I74nI&pM&#(nc+q4tx-LuX8yzsSRD`QimHEm`+w$lHD|H&0D1EG{fAuP84o z*_of0mY%1}%gN2n&d$qDPsvbem220$|8nlvXD_C|Iq2qmLL_VTKE>*K#!dj8iN zg_XZvx%ku7BZn@WJALND$&kXT(wy{!n1}$M4ez}NFX_#Hy!z@Zo>Q>IH*V~3oM?aR z{q?XP)X5pyrTf0TWEQv+i{@_gUANjVXwp~K*TFF#yf!PG?+Lr-!2}YY25=jY#(#M_ z>ZX~&E82+<114hVVeqynWExIri|=tyaSCP-KBvLw=uxeM;*C}4KR36FwC!3!P4 z9}SNJ9vAw-%?jB)dJ)K}e!uP(ZIH%f5 zpK`p1zx#`qz}oX|`WoyC7mvz$TVI1+floHcHXCExRYie32v(qrYa1%W$KWw;HOdbL ziH`yGd-YT)>?}8`Ie7Lx(>3B_5Sd`D6mXMP8R6;fzAe@MG1zQ-4EFEg5wCO)j{zkz z+@i-IVn4MNvRJ8*jJcbqUW3p|G%%{#hD6fTjSpgBuzH9*-{@bS@f@UJ?xs1NRLRaz zn_(f*M5I(Ih-r9iS{t+HR4P!ufPhj#9Uc-F@CHhSuGCXtfiRoIp&P&Q%B-;R>gxK7 z`f~kcdIoas%p>s`2qN?7g!aS<=^4=JR9eH2vVTA06{w7q7ah`Dj1TE zv6sMtmw-=g7PpN`1%9e9%`m+sPN-O4f>tTgOOTR6ahr9?J&QBnD5rWOz<28gm>%1M zqk~`b3t96amJcKDM9D+<>W{-V`g{|HAEh&M*2kdek?N-EIx~%A(qkZ(E$5eUUi?y- z7q?WlM9AUbC5 z9E9dc^hXFVn|E?)5pD-%W! zZG!@V9)LkZhK?A;k4Cim=)vgjPMkJ((XyBS@dmOw*#m&HqqbfGRSGN_m>vN0`C5DW z)8TR%@Q)+r*RNkUHo?D)4xV3fu*1Lblkvwk=gwm9@YHwT0RA687ycb#fUcnmVe#yV z;^hN)L#(qa76=XOZ-L)8^kZnAw7Cn|-@iAy3N(ph4}UU@>N_L4itEBteZc6i7(Zqx z(Vu#|U7Yp*kGAswi|XFG{tT!@jlCyQ#4a{KX^NnTfb=TZO^imtu85#?7-WMe{rBtiATy?6rX4 ze-8~-?blb3fh;VqsVK|HE#^SYKkEW4S9{L)@o|_w-EOY$*7WdIab7*M3rp+EYxnJ| z!^=T=S$=+5c3EjDJR=7G*vzQFWox}kzWm|)w57T$EL_(4_&P1~-jwjI+vOYA3$o6f z|KjuS4(%n1xwJv(e+z>8L)H<6sCyTSw01KjiBB>!8=Os^7&)o%t5=*{54unYLx zJ6+!lQWiYspG#Uep)dV_twE+2=n-(t^bUuFy_lOE@yZK<$bR-6*$~Rf9<1(qNBN(Cu;gX zVDvvm^v{1S{kcz?Kb122NA-?pVIMl^M>f%oj_A+B;t}=Yv_~$*;lWU5ln~^0q6QUR z80wvKKK5B$Gr<221$}6#bNig7P)}kT7}-P{=`Elq>GE{e1om6g#pX)P{2nxEXOvWY zu9+v7(+Qg#HU2Z&@xPn!|I=&me;`&`+KzuoDt{K!=d;?WXTP9FKy1(5rQ*B5E<6Rg zQ@6Gq!rW93$|hyZ;~U%&@}|0e7W1+ws*z7}%v{KzSc`{wpu#C_Dk zJ39gIWDtSqSS=#%BlnI#4<&aTAoho2T7Z*(tda+F1Nvw1wkYw#xemuH8C5>ct_$bk z5(Wcdva7-KWr#@y1?adrH+ zt~YOAD~u_rsjuE&T2NbFR+19GJO4mcVP;}%LyV6;SerZzTOSnKJ{KHl zNT^~Xf|v!CmRs`~`_q{X^cwazFy;Rnu|JxzKktp~ACw-OkZ|x|eRxdb_6=g5h~h+& zgs%9f-#qR3FW}iK)Nu9e824Pa(nWh#g~W9K6zfc}k zSNB`fh34Ys-__i2%Mo?rek$A_t=qL&H3ckiO}ZtFINM8@r09kk>< zirM2`Ow{|EH+E%xZW^(khQxnIi>#MQycE#;yk`$m&j=8yT(vNNyXM>9i?>Y?M3FZ8* zPV=nHi1*&UzMjN;qgiddH=0T=5Al9F8b;>Wcjo=ZE=r$xf04(@dICO&GiSoJZdWPC zNgJh2w^eskckeKz|M(U=2ZGTs&(2Y6UAxL`o>q1``*@~Vw(Iw33l=+a4!sc8`ReuJK5AsO??61X-Lx`)d0o7mRGp%|HYL{ z7q49{KG?zw!qfemZCAK1aCTkl;cl}sB5A_{pGcR!6-AZxwTBKJsH>@}uB<95uF9{f zsH`k1Bng!loff@%+3KZvpI`kscgbki_qPQ&uMP4s*&zGc_41ut<@@g6|MQRgU!G~W zfA^?=)+j|s=U^}w}jRwLco&i!%IX3k#m{+gg2VXjGelXQGL=aE z7E9POpg#N>Q_HwEwNKP<4-FCZ@%Kc1f&ClR)IWd;F`@qI0@D?7;+&v=izU9N`qN^e zAzsjWZW_l4Z;9Xd2Ivc=FWY9rjX|owjKJqXmx2_c=I@!?k^5zg`_lRhfWI~leFGbI zg<`KK%DJK=_>Tkpn%QtOW|-vpfc#{z3&|ry@`rXN|2&YtP?g+-jDHvMYeDs^VxGo` z;J@Dv{+u_0Ur0yo_`#^~7+GY{#_i(46%Kb&Ud#QxT&)gsdwGWL+JPYX{#n=QTg>fPN>+ z_KWBb6CEF#4eJ2?337Sp7p*uH&&Z$NiTrzGr0F90<3;kHm41QSb3*JuDmEwh;}2oG z!G1hMx$q%iKRpPt^RxDZ$1<@mlf}#aj{gUzY=u}UgMSs^|95UDp+CfW$@W*+FE449 z^YW%F{i>Ywee@Qf@q4iPx;;v^$JuW&1^RbKKi0s1l?Z>_&{Yfl62SjH;D50L{CyPO zeZ0KAz32lo0Gbgq$fD%su zB`zcIot^@QoB@K4F#UND>?H!E5XU>EnrDWMS{+!=4CEcp@xh zuD|+;Fy9fr4{RMonNZb&TfBHA&;tRlB2N9WWaaGPwX$RG=#@ znx}#aN57ll|ETWXx~qi$qj@SwufhGtO90$|^8Q<~{>mZRPcH#K{pW{&qoVWU<3sQg zP%1tYwyuAF`O+mz7E^+h9twStfMes~E)Rufd?^JsL($iR?L!ZTk?)|d3#Zj_XkyIR zv7_|RLJ}9hr*c2rsk&XRbUv0Cqm=v zo(G@Zxbf??TZLx@g`jv^zR+yGu}6Tdvx)m=`LT~mcYhG!G@_!a{7~JI!w2j4R^y3K zTvAigJNKXO(-)7L=Dljord7dCW*d{ga=m`|E-o|kPyRW(&B%89C6;^34hwVARltX)v^(cNq< zEw>bR#wwqsC13nlm^WVhN^W`jl`8u9HMb<`;OG7?yqiKqUrmU>5I!2mshUIJ$ z_Q>UYs^n~Qf>4X=dQ49b*m>{(%^}2cXf;vEJ_+MP-`*V+E0@KDN2}HJ3phX`O)GL+ zA*FRvnQcO+s#@j@u@1mtJax)Oqoj)~n&q6lIZL}jp0S^g8^IP8!oxx+jK6M6Sajl| zCH@q~-xc{pgHx||oTjIq!XR~T)IV|e7*79b)6%}YpTbx05%BRApo-iIo2zm(S9L)f z-a^5t$x#b>mtW9x{yb_NC75;>9TXnRs{(SDba6(4E1oaW+ahXex;(=(BL!)EHBvc1 z^rhYdU8OEsvh*i0lmY{U(gi^2f;n^SoN%%VD7Bjhna#xYd`M+i^zpq#Fl8*I0V=xs zP~X+Z1+!C6WG^X;FLD&SRSR+R!4{g|%1+JEStgx1${9~2j#70Wj1<3sH)8a>8l%!n zm!GH!+MDTWG_T*hc}opZ;Vyrtfr0etEdjlv+;ufbwP}n>QT)~`xO=W4>5q)0pB#ss zQe9e*Me=%E;QK3Jr)Z&lQU#C>Y6mHXqLiuB*EeV$C7?v0)u2)TUBHr2R99EuV3eVO zzQO1*<0p)VVTCjkwx>pFzl&xpVkpJ&`N6Hw)DmcG=>Q_)>({P9_;hi*i#~p;spXOt@2}gsGcqwbJ+I>Ig}W~W zLGepj>V{okKUb(4{yRw1UqGNKv_(B+`k4LD~5kZxClbUXe==*ZC`;^;P! zqgIKkBuS!Hat28HqE3a|Txybv6G@)*X*ozLK%WlIh*6VtOJ|bK21!df2vn`qbmSL% zX26@s%96LE^e>iBc@*E!j?yeON^!>l5tXhe?H!#Q9JGEbRkV;Tq0)e~FAKH9l_pyv zXKyWE$73Xrap!IdC#L`8&AHihb0puU+a@q3(BTs-vYQ1Yac;$60F+>B%ji!Q1y z>24$z6Z!K`n$9(+HNWfv)6y>DR0Go!1XCQ`qEL#g15VLV5ThM`hT58Ye4ddQA(z9D z#^vVP+w5E^$y&3_Ox1L4#VH-Krv)~cy_OjVv9!ywPLYhE;Jg>Fxs00yWIev|b7)8ZI>541`EUK>)u{0P}TR z-0|(eEiKAAyYg=MMyEj-Z#vjmnwig<@9G85VxiqEQzJ`Jp-z}Eaq?8;Qn0D@U(rg@ zc2cP4zxkdiREAaoC8xr*x7yIkvmhhx>42*D??R~F{_7Un0+4A}leGs6s9eFOlLC09 z{Zl4VfBet)5UHOW9}KjX705-ju3iC=O7oRAwE9zoampAxco7;V4v)A=OA%snLx!9MBv#l(7|;EZ|h@4j4FazyRb>1`i%O zLKo^(v@D3N$TVWt3HzyPzHx?R3`rL6YK_3L-;ow8nQ}aY;NgZGJnC?g9(jo9zYWYQebRJ0Wp?K9Fmk1 zE5-n2o9Xpc?f*iqS^=_U?U3!pAPZ}>O|Sl~jsY^rMl!vc`9{e0O-+oCkJuI%v{keK zR5GQ8v21Y&3Kxvc2V*%Av4w@`J!xASir6jA{nXj;*x37V0{E&YOOT;y5LOzS_-S%~ z+qZ{A$7G{p@M+V>&56yeMAx)>)-rg0Gv57ySJWHkhJB8-$7k}?b85UsRS;hJ`WC`# zWJkPa*ThKU&rs{M&SzPP;lS%ze0H_MX`zv?mE7hU@z?ZmT9u%Mlk_kJDh8yckbET( zyIcKb#l}At{rl_=kBNuaj7Y{|M49Zb_~tgymgF|)y~x$c=m^?Ho1--HRjvkY*?tkU z+9hd_ukmUDi~PsVtsB;_MgAi`%qe6K^8;e=(^L54bhr&jOKmHOZKRF(C+;pI?Q^w& zMNT|GTU>=4nP7N8K2CV@76DHllLapP%pyaS#9 z#(?-B&bC0kN>IO|HFh-AtCqfj!At!IdQC6_nt)hmys(ZO$q+lm%F)|PM64@J02%_? zJGpweyExg?T0a;IBfuTzuM3hP4D=AFc;|;}jeh`hz!9xj*f<4Zhrv9?Pq7fUS}iPQ z&v)~t0EivLtED;s0>o0|^#225@jCx&6FvyD-9^muH~3qvw~_w)|3_J81jRd2R!Uh) z1v*%;N2=dlRI%8~G9V9t8`B#XX~!7gE2}q>av|u#Vj8xsh8ikX7(k1qO8j{^8w~=t zxD-ve)g3Wx*oZE;RSvk*1+_D7+_`(F;g`bejV(XSu=4cvSe^aF!&c$ZUxI??6&H%5 z78utZs;Y%6aOfadTU}XHRGC-FR~QuM!6XK1qrw9G)&%B%{>9gMkf%NYYgVt`7!(*) z_L(bCTT*}X#?^*<-+%Vojf=OgUXIQ^h+7qziIKruHhsAI{gulD7WsN>P&;v|vDuN z=vq5u;|a2{fGmy$TB(u*K(<-~*}4vpZN}yxAX^B?N+4v1Bo*N5I}O=n8<|Ha4%yU@ zt>mF(g;Z%emiAwz>_2MC-X$q3QZ}6^o0)}kjcO^YsM4wyZGk@NvSiuj4I6hLW`<}T zCu{9O*}^u;8jvGUSV#$kcu~kw&tT9xYTZW0nk{BR$HvFu{`?T=*rcdXza<3PRjWS$ zXlYZQXC`Z0WF3F!pQaPw7)PW{eU-GKT}hiyq*c``h_s=Mw56=XAEQ4aEj4F@v`K2x zcCWqt!|BFG6lXN*+`iS=c z!MeaLp^>4hfTlpyQl$WJ6Xvu5H#t4^G^Fi50QU|9?u$0ywg&X@UxZgPUmwm_ z>BGY~;Jn`wnd{~P3s&mnsDNi(wJtjp=XK;C*7W3Haw=&7^8To=e%gsf>4$J-B}NClI%7`!=9 zaVvPLP186I`jr+lwQ-ltopT*ac?`6`vT7Ax*G33!ygDqI#mm9_WZ9PuE zJA7+^SR|H@M04y1V zOy1BDdRX3Mb=r)-NNWs&mw+24WGAQwJnFiybNk`#2lua}qs3&Wtw%;d$^M@nVyXUG zBZc&YYsJa-HZ}W;51y>wzkgqST}^dWPEC1HSt(lRi}P|bbFz0PY+JNsbx_eK-+poS zc+JrR<%Jd12TmTS{phlA(dEaI19xxUYWVY;6SuEk{_*n9p*e^46=fxcu3riD@8Ru@ zeJnROA4lt%Gc7F5r%s(_vUJ6J?{C=|8l9GxlYZdKU%vRFDC6s&ez>m`np%{vE7xWK zK6&(|TIDJNvjYDPVgSxO0VhEN;LIZ;fSWe)o26A`$?m{JeUF>~92wEk~$MuStV4%nN@w#@@enHxX_K_T@|ttTHXj?<|Gsr@-hmyvG5jp+!1cr zN_U>fMxb*Ax-8MWp1`}31)2jHd7*HTXHG*HpZ3|FvjNW)G(HxBe7A=8SJ~Ujk8(uQg)W0@>sK6Ay;H+7bIlt zSBVA!He_~(?$}HV@gb2hTegQV10f>rIdQfgoIP9$&So)Tn*h!pBMSkXy$#M@iqUXZ zOA-*ESlm6ppIFN;lK8bS8$lbOMbx=F;0AcLI`tq~>*(aD!cqxuKafdV>)ErY$O;kX zsVv~EgJ$h<FjxD^7fliKgv(bldv%uYV z5eREVny)>a<%I6G4GHcCVTUCx#w5@EQ~0zhG8jDBzryFuD(H8L|ru$Dq7?6kZ>O z;`L$F=+SU$^>pD03>!g~E|?48jxpf$`i>kibYTC!efkX^&Vb7g=}w#Qbh5WQ{b>-6 zt57n65)#5dt^Nb>4|)$7p+CXc+`?qyC`96hNmvgdU67)c%GaXzxBGYg`0dA-KLkE$ zd(P)S|7YhV0sYp;k12SL7k({}&9|$nEjjp+n!G@7wTRw=g6ynxdFIaet$s_^t}j0I z!pc${n>CuG(7o zaKnyhS>zUq8qjLV3u5qoVsK?A1|I~24}rnAkShKq=4G4KYEXLpY z^ROCJzTJIT`hfH3hWvpmk_X+X4$6sD3*v~BBh|i2>2&#ESPis)Nbv)PV_Nvez9C%P z2@?@JZech^1_2xC+9EF``i%w;^-1z_$Q)BIzZ%WDDCTBp_VIGIpJRibZHDFrIu6c& zud9;0Pn$Z-Yg5N*|v_Jei|-Y zO&Eu?F_!2jPelNYc@5w)4jChYw&?%DWsZD)hGp(5CCkvC{i|@LRXmuEi5Y)`sLb7d zfz1;M@@T&?Yxfzbth%9n{o2)Qt=GFTV^?vd=@nD=#L%O}WA(hO&D8D0V;9KYcEf=; zfiQmi<9PbO{(}Y&)0=2&X=O6eP?u~7 zEGBA9-&a-ejGKSlyWj91*%Lu|`}p_I|54RE7G4UfGkaS(g;I4XFV@bfqN?cNA=1FG zdn+rmDoYAV_+o>c?5vE`thAkR+q{>o{jlWZk>j6z|HBt&K0f}*zrXqT%O8LEYU;m! z{!huNr@#OH=6IoYolB8YmC^D~Qp!=x_%Se5jI7 zktFkFE#=LdxXsc6$l!h?yF!!L>8_~Fr;?I5(73*h#u?>AW4gFZOMc2w?fQ%q#Ard| zv`W-OF&b~~AcCW#BZ$Uz$?ze#R7o|1apcEs8aP@R^Fj^dTWp}lw)_&i!kDj8RZGt> z4cv26AbR*&r8XyP6j`jQrBdyjyuvmVzxy#c5Cx+8MYNaZM4Qw@G$wwvWeFMSBjOw} za-eM2YIfX!-RR0IkngO!^P;I92yShD$`A~Xq0jlv48d@VfZ(&RcaPV%A-I?!xT$_% zU9j_qT?s5Z+g#WERQZ}jxtvQNPxtpmt%TZIMZy&LxpH|$1v44iwJ($bnci`@Ul9zc+xjKbmow?h?Gbo&%K735C=!6X1Z8U^w|4UK6rt-TLU*Vm zs-ECEh|Pe=9Fri%x3qXnr@klzyeJQhM*@x2kOyNSU?^l~hXuA)=2q5o8Fjr}>}MNK z;>Vj$q?K&2?ypy_&<9ah3lU%ynp}Athlkw&>IxvPNL^72Yhl&9MGf87 zE6p9C`vaS#o#=D)V2v8OTLa%;&M$e3CTYu8EMLAtwQ}e(e=i`{2u=fx2KpbO2;(MB zQX0KIiQJuW0P57KlkxxE06gj@O*6N~cyq@15xsj4)EmoB7%>?u9g{{IPMBsg)7;A3 zWa{JzV@Hh|JqGK2{4nWobPSH5EpOTZ8LC83SPNp9M8N$S~arrdG3< z3Lc6hs)NuZ!X)$SB(P~tRaI$LzU-yY^5RJ=FCdqzXl{Ag+N$7{D(+HV+&q`Eih}(I z>*~<>irtX1jPl}quGj!g$mwZWDWOr@J(sLmQ*!*%k3T>6QAt^OLE+xgsp(*uCr4O@4_B+Al~ z<@>&<`e65(#oP8>y8Zb_ci)WNj7GKhAY%7wP}2r!HL%+USH0+X6|#=t%|Vi(s!FK=?^^(9C>HC;`hEEt?&gvN7P*@zrk?1uOd$5@G@VPN ze|w7hH!(TdqtB}MndQ5daQ2_0XlXoyZ_uL4u1@jpcKQl7syTz*0~vkkd_zJKqi=OF z=-VP!WoZ+ATi`ql*F+b@a*fDPR7g;{Mo2^>;Hy<%RIDoMS6MJ8J%g+V;5QP-uGRRx z0sLNy(co7q3E&qCOH_=!swLf*0>A0l-9zpqH!CH-B zcG^pqusqcO;%(gYISai!ob9b4e%+AzViPr@E+P$7y+pG<@+BZ~o4q*io<80zfr|w@ z-l3Z#ikVQS{Wf}D7tEhyVP-kY*3pCa>&_TF(Q5p-@mK=y0^u2!a~AxsA$;`}2-9IN zRJPvLx^ov0Rw6HkrHtE@7vpa~r+cUJZcPzqhOnz+f=9 za@YzG*wxP5$WRYfF0x>TqsNSyIK|jhIrD9@e@u*xO=rx+gp;3c3N1f#_IzhI=LMEV zx`T%3O|}4yZ5P;Ej~_l%f7-0M^Rc%+cdiW?N7E z{{4*y^!l%?HIt&wg^|pv-;FLTBvFY|8)Wv-55sa7k23Nnu${b#`HPc1Cn;L~{Aw zvh3LP-g9T$V9#c%iJPtKQVoIeRGR7!0)H43932^-At%2Er&w?0&50?{yLxO_{!NqAB1h;HbZI-5HwL~D zbL)BL{}O@swG+5`mm*ZFHX|PPF9A4nFBPN`fFr^>0(dt7y!8MRzS5M^pFi$?`qPX< z6(4ofzJ%b%*s8jrLGZv12!_sN2v%qa+=E@zCJ*ApEBr-gHSu=@)4ka-(a?80HmMz7 zF*t@;1C?0BNAE_cL0CCx)q5}=Fl^gMsyC#1Z^5BDfVUFheU8vr_jCg9ey$67PlLP% znDx;8cHOzud`4breO+_?fLO;RuZ8cCY7xHLwYQs^8q{$HL>v&t9Vibud>F|PvOU;# z12Y~5hVOv{j=~DJd{0a=%CX@)JjbN4HBOrTE$Dl?j?uRyLPK9+4o~!TUAKp{FFT$S zCepX)WV0NBhAge{>d0ob?c3I7u^~7-an;gAi&+n9Y;(MDsP&w7O;Irb+*gKj>@2a- zA|)v^6Z}1!@lV_hX8ks)<*$|mf_I4m2pqe$bdq4`#yPx0iwJX(C9`HGu<`UMc&iq7f^v(0B(SlKwZ`}pGY?flus=)kjpN;H}T8@PktKr3&I zx=a6?4@~72+LxhsDb^rh*e03{qU^fh>K#?4#fQe#68x9 zxZRlKY-?KwcbX^8 zo;q&yxM|idKF9(3dD)M8`>nx~ZCyO^74V{hKqtFd)9|%6oG`_BfXUQ}NSonx!*I;F z@kUdSP*%+pW(cO732&@DZOSBE8}4N^eTKR51bw&+FeD@cRc*j+?XT>o=>ND=3r3H- z5B~i9&bb6m=*|f(DkYHHjb?2;w$Faem)Up}mC5(kmsM4Pwk5?yNvJ(4z;Vwkc{ZQ^ zPFzIzX3xbRtj<4j?(ErpA$pQYwoapZy2qbBf7b1*@BUp-|Kj(j&su*x^Y?EL?%erh zS891hZhrK-r4IOYwX`(1bhGwcq2Vo_|5N;zV$o@R$eys+q}by9Kb}k592T%5D0{;U z3+L~!7FW&(Yh4n4k{i41@LP{6lJE)~9VevwbR2NxovNiBz47>ln3HExjB zg2lbS;td$K#iXUB@JtQ2Zc=tcacr9!RwYVuIc5m+MB>&qE!@1Tl}IeZ?g2=wn^~(N zabiaj$Al7z50Mg5VH#g@zBBtM{^xTgCM z!bq0g0*cSRO*U}G5vGPI?a+(9d|`y)h)6C%i0T)e8;Scdc*aqr1OJ1P#UxIe{xx{~ z>AvTAEx9^n(Vclb#QDSBZ9EPad0cohyG7n4=d!dSs~0qCJYYPlc5d5yX;%0p4;LP9BB^b*o zFq6aPgkLXT(F-ObD`{uKO~BrSM7@bd_hp6oZ=<++wiQk?nogfK8M_kF2@t?kGY1+& z3=1GKhyDo~AK?aLlK~GJH|qbc*NswAXdHsl8aadU7;~jjhU39wvLmd~1mTW}8yf-Q zG>nHc_B2QYlOCrHG;bf3uLO2A@6!Xkf$husR5|C7?4L3y&z}n@({RoWj<);4`Lm2C z@Z+R7Cu5{dqdDHh2$5b~yGHEsz~TT;+Zoem&YI`C`296&SFiMU)a@bZHGZD&^7r0bg$;~l zOZ;5t&73f1+?1JC)>_sUGnFR2OlO!`&Yoj~(>=JhIUJWF@MT5-#g1h2%o&i{)5hzM z7=oml66X*2AzE-R8V5G@7y9vi8#;m6|K9I+Z$0`d3bQvs`RwM6+c)muLgSr>P{N#w z`z1GKmQP_xPHk05Wkp3f$Xu9^pOb~FAO)DkrKToFgoOur`LF&U_sD0Te{nQ&>WHnC zwcEydMxOraGq=ya`>v?+`R~8qee%=6KW|>Y+HiG8dPPM+PW0ME){q7BZOkm(W;=Vd zquFSRAJDuu5W%C!-LZuSemGP0Vdz@-Rl)AY_DeEa1Zna^q=3&g5S4>f^tXBcb0ACP zsuZ2jkUbH^V;(r>%38}Aj$_LZjUZ*bD?(JpTTUqxrOBlvj9=6djt^>ZO!K+cPzqCs zG|pl)PJ%AZiX>f(x-!G_Fcc zOQLf!uc2`_*7U~7{uW`(*Y>Te)wsb>#d%Q0LkPzuDJ+8)h)rR(OTmJ^@x5gUF%i4` zm$3}Q0DxHRe@6W?WgzPAv@{h1!%vzOP1?n!m7lBj_uU60xXp?PKMV@j7PV10C69s- z()~o?e0w(yg;~2NQTSYQoz8*skd)N33Cs#sHQj(2eEKw>U?k7LVGL9~bjd-WDi4>u zC^Hu)kBUwd<#1EH5^7eO{sr*+)zN?QT61;E<2T#Snl&4nX`&n+x^Qh+8-7F8a`;4c zb}RVHXK82dE}HjJV@HIuuFntGZ^p40mz`naep;)Vzx!%A;;#n3NeLB68SgLM1Nzn*_7#a@BurVA@ zmkv=DP0ep+Gbrp!f*6GlW1E0p+FIkV15D`cPU6czzZLkUm9U`coA5upx@l86(4}W zD_1UG?Bi;0Wjtky@k~o=TidzwXmgKQF&;3(@m0V=%p!ax@bcp3G=ILMtM?-RMSdRh zt*z}HT)da9{&3ye_W~UCdq}#CvR$-#&6?FXCA(~~x1+V`47E%26Bp@*_j06jI^xeQ~m7z!-s!fuYLIN+O0eHBjTzn zt8--={2c5SIL)1FV(vN@F9YgW+O(-6jMr@p3kl!7DK@p{+i#A&7yF^Fm*0F$>DE9e zM}xpeFY&_2hqCqGv$a7WdY4{HC}%!|}k?x*Qp8?<8&5VTo(jY;Q}a}3%C z2--#V4xOPLC5`{Ax$dn4W%Uf&aF7*EHyaV3;1Y(BYL1N+!xQcEyNF0Wsvl!^RCHlX zcsP^IoJ<-oQ^iy6L7Gmr%wHe-J5Q0TQ zj0jN>zBxLMJC+;w5+b@cdYUz^B&-Z2yCq14&17vnLxO_jb2C1y+WAeEh8Orf2Y1UM zp(#a&UWN|*ro-jcDUjt?=wRS>8qqP$vS`F|Gn>KAAfbWP*E3DclMu;!`1c1W_MsWj+5MM)x z0{E6(RbCUWzXcr)rFiSsZT^mM_hkcjPug%#bx&w$#Ybl?{l5k|zXEM;s+Gf+FZOkJ zv@xGyW@S6yfl@8>R6}!-2k$ck6c4~Q9bSKs|MtcT;M_TO3q5!*BM)agTRXgUc=#{F z{{70u&SQE@x*OOAe6SkV4ww4-csS0PImKv-skNiKx3;&dlY_!>67HG)I6> z1X~EdBLH&R^R~CM#R1|8qjcXHL1%WmQ6%{lkU#9#+PATd#gyaVg@xu-Z0{!5E*Ax9%S+m+05s7|1=%q;Xoe8fHJ)9cYB2c`% zDzbYb~4xA6DNfnu%L#7DMm!ma;OcCWLt)EKCmwqN{aIUUT zR|!6VBzQ$63N~3Dj&M$fbU$p_#e{l^@|)CmZ}EI?oGd1G&-vD-9ANxGGo*LbIY9ig zU=iX7+~p>f5ya(f%6s2e?aI5*&aMN*bF*sz@z0y zPD&^SySXB+Q0r_){PVb9F$cUHqk(rf31FrJs=S?RWqn6DS`nD^? zQOLGoM^svo2I4;u#Icv$2654%CWLom2iC(tls+E0~1^8k@is2sefgWDGhr5@LH+&rjS9+59`Y&F( zZ28i~{{DVGUUb;q(s~}=RvaDX&9<_(!)A<&hqv#d0KbJ3`*-hUXzROtv7eWRi-X-9 z^Jx>tOqgb2k9BzMB|dKG+~b|K-0<^z4`g3R_#k+O;t9a6rSTqvY2(puj)k$&xX}hk zI1e7!zyE-NG#zZ0;g9;Ybf)){M-LwSc|4m&g4c>JKKkMEe}27ow<7btz!SYwch2z7 zDoih~EKt+CASxp*NsfFnqql5FXmHR1WbMli9X)Zfa{W}@O*zS{2KsC(JA2yg+`mt! zfAs8X!;`-+?)&G@JNIrk$WqFRi__!Qdd{0Y7klw$Go9@`eLS5&Zwqr%iwQ77m2pE03YR$vXds) z3M8O=Ao{pCqdU!?jKw{YWJ`DI&xl#s4ZooX(>U zs6p15o#xG@8l_GUmq3+2c_YL7k|?i;3EHG~Q21Cngg!(g$U{8eR||6LN$X959A@^m z=;-t3RZUr)LB2b$pa^LW0(n6ZfjqknaRRy zu1-x?oX>xMR~ycA)Hwf$%T~%6&SiOX|Lz#4+m4E#4O_$GlGgd59XV)QSTq+eJx3Py zsbh-bzD1kL8O`x2faY1MBEC=?G>?A~cZK1+RjtLlOEAA$v7B2bS*oPTA_5))cBhpA z!eR-){o#HG%s|=_}P1y}q`|w^;Pwe#xZv7!rp(R}$9c-+uY;0`jF9gM1fHjo=;Aul% z3PyF)jX9GyKz#GYpw1Bg_B9Zv;!J|L79g&K0#`H$062e7dcPCHl{d9+v?Kf_TQ5N} z`cm&-Sd|)Gmbgp)S@Tu%HGQs`%(P{%nff}evzjyo?9MHbFrl8P7;}QKVufT zbcsLSO|X8BbG2~jtjwkx8Bye8md!l43y!u%gWr04l%7OdC$0wq7I<){U?Ki3D5S#!k>$i4=FhdBg;2Pgmk)wIg4aL~lK_E{* zSKkrgHRtf11R?y~mq-mlv|kc`@EZ}{qE_G{!f!xBk0p!g%*OA9Su1eHP(%35r@rjf>YqP{RgXB9; zGLmQHLyez2lO)T{2FXvik-Swsp}fLKewfaw52(Ykpm=1xpb!PA@+~CCKV@>9lRf_L z9IuHbUj@;S*x27d@jUz#81iF z`CU~3e%EDm;kQ6$O3qwShnL~^5o%BvzG0^HtjUI%a*pu*g6VLST~HoG-hW5h!Gogz z&Dugpi3?HE$S6L#H&fy%SOR2QD4=&z(&MKXy<3a> zY|bQj)AOSU@KzQHh1w_c3Er0(ycKGA_mZpx8OU^9y0mGDa1@=*T90dP@+H|nCyQFjPUAxBRzv03O%7Rp?(8#!k?-oCE`h4FCrYQC6x<~_B& zP;ZRjppTczQ|UDla-3cnXcCDDr7I34dQulAj$_TSvf{0K;iqy%m~S3+wspYv^#3uo zarT6?H=R%C)dmWOu4BSB9B?(ZRWMFSd-Gk<{rDF5Ms%|-{C0Gg7s^x7-G&y-75HUY zhB%%!et{svM=i_ESdxp7<6LXX>LtVkG(uQO1%X^x*%(XC` zIb-IGDP#3ekUVDGBrM*{Ft?aFX+-~ldXs0&oHAkDSVQz;ygPi@yOS*K91%O8?SYCs zm{oY(k;9I!B3`**UpYBD&9^o)oneK3CVY`mAmZnZ??M^$xmG5V4Br{tw@-icX=#nV990HaFmh7uLbhv2E)KRPA;#LjzUteg-eKh#F z@MF2+xvW9_!Eb_hG{KuPex2dnQ(hbzvSSb6y_*BOtJUmQZED$!Be;sBzG>v6s8#sZ zI1RihXx$0kG|g-Y6~d$)=*@zDP>}KH>F7Z3ji7hPX-4l%4ZSn6dAWA>$8GplsPTOn z_|}d(Qdy}4zBNKTPlInowN{PDZ(jDOo!@m>Zpp`T3(WEST9_-O!)p>KQzE+JQYwT) zkw#*2n8W*PIud;QcAb!2MKCh%+~J#2+8F*RF}%2);T6Ti@cb?em+mEq=XHQMZFG|c zXAsXh&meyL_VcFe(BK0uoK8p}6&@U%c2HE|TxfSB`Vb;fMD=D0JTi)z;k-->84?8; zUZi38Cr|UZT%Fo33?FK{awppEL`Q`T6=L|2Tsenl<8!%ImfY(Z5I&OP<`KA21v7j- z+TcQbd^Bcwd9os`f`5VnDo}B`XbJ)FYz09LFkVN(qW+xH%wroun8A}BrMm56IIG_En|D( zZXtNiY;X?tw`3G&s2cSTvrjl?f48tz!XdQHLg04x@g#6NIJ-K+Y31j?1B8phqs49zgd(&f+a&ac0Ck*iWp2(}^|GD^I+1l^Vx&!( zL*A&{WEkMnc@x1{VE#8*Cmv)%uwdVYO;FuvA#Ar!*wre+H-A~6y>2+)BEA*ZV2g;N zTco!D&!mg+esqh{eH!PaqwKzT5!VYZ;KZ#cyEW`a@1~mFB)hp4Z^No)j+VDCeoc5k zPyE85mvpw7)m%qs2RmEL9qGP1zB=yC_84KhFR-?tN)xR8(Gf!f!?DQiO*1i_Hg43Y zu|`vjSeg$nL;CNI(4S^G+tSo*cF(!iv*+M)030XY)z}3-H{Pk}@;ud$m`*dXobQTr zVD6qi_{!sIBnHT^Uu?~$j2eB{=aw8-Tp96?)+X{CvdI8cNLdz{C4;1 z^~*PF3x5ZMYnxoBv>+M<)kEY5s+GG*_RyASR@xl#4#-u;`G@5V-z=4E8d0{va>=VER> zYNGutcN|K_s*8o?Ov@Qlrnq=GPLcHFB?F~e-6Rs-Pco}U|!(kpqo(L0#tX;(wbd3JpyoV2e?b?I)Xb42S@tlmb8&OB635<5hlA;%mEkb zJDMlWgzYRjT>&T2omoSvK*DyEh;6b3Abf*>?a0J;n|NF;wfk+}q5*YrLV8wtp|VJNsFp)%=r4@aO10GPMn1`M9wrGn-q?ll z7qA6RHi-b+goh7~gQttxR`?QragPA>b0FJ5d*N7*(So=oE4(LWT1=g(8loF|IV)vuA@QFa>lvsipf&r$18sM}8P5^gs zu;=ZD&WGDe0Ef&c+l0_e0OuEV_aiBY9H0(9GuD~UyLY2c&Xso`0Tf7FWhKZ@U zg}D{TMTImEG*P~W7yiQmHgcJKQkTZie4Zvi`ry?^P1@58l(?|4?5Odd$P^j@yLY{?>D z&U+dh>;PXVa8IOfJQvQJgU6D?EMud|*fc~06UP%x5VSCzWjD`ejtz#4i4zPBMo%}MJbL7)Nwe{VvcO!FH3~Y+x1DW)^`_~@ z=C)2q$ImdHIorY2&Bf6P{iv|3Jdplb!wwX{{Df5)fM{>mj+H6Z0Tg--(%^Pq7%p5PJDJcvHJO=KOa1~ zRe^uYz1x38hv(*}r6#WTg-ehBFHB8st=w_VV3vuAxw*-7iy7lAmMqZf-}kLvI&W!7 zw7W@Hojn-4ZQGLBW5-Rf^S&uazdzb6ARBn_$COuwkPOBr0AsNZv@49O)i7R9Fs@g_ znA_C6St`P~3Vn5=jE;z0liv>G7j=?07>gR3*T9%d6q0l^*}5Xp7>%Opw|t`UI?y;w zq;Umk{PxL1NwO@wx@30{(aM;6tS;%2=w`QSXw2@xG6!Vqd9Iq%(D;vp+eo!^W^t)n zL-%AXP9gi_&p4)^N05HrZntW+sGr452~~0wEs8M<(f8l3?TEJfvmFO<_uZBBUU4w5hNk$T(YlNuEL86 z@i^zP7$ebaf{W>EcV=C04~uK3@rsT#t`ljjif;mq@5KHZqoHvR3GOMsw{ityBp`1$ z?7~2q`S-*h0bOxTTze@Z**v6lPec=FRndPDMwH!HNnJ0{kDUpDo2|lKSTUDP*Fgjv z7}O9IR}S$ddan@K;Ze(N-ayEuefE zZLuBL%>CMkRmHb20n0!CB&zCD13w}xXQ#$Tpv``@2Fn!wS&ixB66(HWhQy*pUe0!N z=R3Li_;@%kbocR|KV5&wuy=F~(7Ay=jRF1M?mOt6F;ixM&6bl4498C#gK~SA_fxR; zVr6ZMAu?(N&1NEOjYrZnBOLA>GosI1{YGj}nL2$2Z)Jw+ROs<(=odtBv*Ea@mi7y= zZjaF>&TZMvwpoCS0W{rUGhk2LTQN7%A3kKz09F5%e%vcSo?MtGm!)Q(fQW86Q}gqe zU;X;8&%gUmW$vEm=#)}_u;(Sr1Ch{+BL_U_43Vqy8PBa4YjT)IRpi!~%hF~`z6*ch=QhfkK&odkz#b5q(lTpQE6Pb&NQaT64{ zS`rr#h10uGcyFYZ>=Se`>+H>nDkUTOanlvGCLYW*@sT5VQ(#+(VSDyOL`Ev3glL@@ z{C)|GOi%B|JZMBUax$J?Yas@I0|r0M6LPy(rjQ3shqZ+{jKNDgFu0g8xU{-VuFMvQ z!I{~QL<5?t=;+)YC9q?noWun7?luJPa1jxloJfLrKOwlhj1YX031XF65D%4X+6btu z{Qw}Q9k}I7m$Dq6Vi5;vOsnF;V(AjJBhg>-OS^;7U@(uRMJ*T`Si%+&?1Aok-n9qp z3>3+;T}1(vb-n4R$Sm}9(0{c2MC#|@*cB1B9s?2!qa}tavA`0l_$8FE5(nqR%@_qD z+CxEL0~D-HFt%~=^$`i|23Lc#d&{1LFf}jpjy>s&hzMZLPwFQ`}K7A^Vt(wg=v$UD-;An4aWjwhX2uydvt&EV%HUWbm{cwqU7J`3- zU>y2UBbZDL5y1%cefHIN7k>KX(l5WDwC>U?814>F`gXf8rfH&ZUqtW&;J5YmKV8t< ze7QH!E0Xv8r;NN6McHYxh+Q4X>q*82Jq-Q*AcS$A5SxbcER3g`T03Ds)6>g;$s&7W zgCRpl0EHmd>`|&HB!y z3RnDEjU73lN4LJZk}2Hu9+St9F+{%|uV;>Q4i-lZjm+$vot+jefM4P~&(e4Xo?`Gk z=nIWOBOZ6I4%XAg>J1-+X=1;Aef#w7tLP{6f7wsjx3%AsP7}o*&;I)JpL;R5K;qVT zvg%Crk)x#dpM8?Kr?9TBrtV;Fb;aJ|oXqI>;@s4v z@D-kB7Um}7t&FGH&35$zgN>(~noOCs!14Vds74sTO9pB6?AJrmPa<)PU$@%d#@O6_ z(Y#TwTN+oUJxG-vmMPRyxGQ)I(2Tzu;N48%tro$%o8Qz#QkYK~n3$AQTtn>LNzsmo zsDN4xd&yKL_G*%O&AXbxUV)*PPvnzy(4MT`9XNzLDaSmJLvDmU_KBf#H^PW;U${${?yU#aXgU#|dw3o;mh9|6Ej z2M-oE5h=;d02~?yvnH}Nsz-D|UU+zHau4+qA|x>3w-Ey)={IM1;I~I^WpWq#;@VxC z0w(%aR+Uy&wA1$?=sT=~cf4*>Nc`@A?c^PAYlCmNO9m?e1$<@cne`05`ASrQ{LJ9X zso^_9f^g=}9a}e{X?)$jVaJBJ1b^8B(?JU5abvo% zbahwwa+J)&A*W#k;86yK9VD=;yQ9PWdA!|Q^I=dR&I{Zx?91+rK;Raa}|&MX43QZb$S!LN-r{wj|;9 z^G^7EiI${Zmk{Il5pMGNGjE_Td}JKPqxTRWh)mvoq@9h$^ogSlCz>trhNJAeba{ZI z*?3+3aZ`+E%rNGsj+!!QB4Tp7s8BMqHP`PybQIN)knsZeTFy{n5dJJ8qFlQ`?{?li|_;-u;LX>8Dz z4cmuz?TbJlQpzUd^@jBC1M>2HlzsVrXte7m>DvMVEBZa|L}2r$j~o8Ev-4{#0Y3S( z>STFhaZ2g2(}m^F(I49SvBzvjc;>Wt_x{A)nN*m^l(VDZv{N z<+ZPj>0c$Yhb8q~he$?Cs47gz;S&^zjKQg88V2v~#NbueCy`N=2%Y+0eL3rSaE)d>vzFI*HR(zuP^pAx5_}6MBWPi~~02ko+Q;&L4 z0sjtPSWlLgmYfhkjrdg3K`V&}(?S2fM-?5-;4e!>-!DCN7z(&f9^OXax^NJ<=o%?t z?U%jC?9__OH}GSPg(0FuBv4;@lV zVC11;3ag-iyT!!HQ&M_|MyIksbbNe12>cvxM<6f<6QW0MSz>1b>nz?D%@TB6OivNO z05-th zmENTH-g_N7QpK)_3JM~{LK6f8Q9vx%K~T|XOe{&nnyxXu+$6TdSdwULw3&IHcc14O znwtB&YyID~?oDp`6~kxtcb|Rs!ORX*G7`H9vP2pDVkuC}Vl`YEBO>boeM7X{LJJNQ z!|?C)Q>7^$hIkH$LPJL}MmX|Gd1#FCIP{_!3EPMwp1fQ`$5YJ?c)#6T^n#tnOdkS? zMdj}5G7Vi)TWD<7GPH0Fiir&I_w@7^hoj@()63h-%P%N|zUT2x&x!>&n2nEv=$;rU zq%VW+ekOJds7pM?uR?Kq)Y=@o(~R8+TaLPZK7f`HYp9Cq5Hf>JOf9XfZBRvFfHf8l zyL37a*hR%a#)@9-?t&5gZXb5LcpJFabdVxCHw4f{3lhf0SpVkJbG>@^Rp_$+5&SIW z?~(rS9F_yX3*CEtFn9|%*~^XbnAwUc$=FR{X3mL?jtKT4VA`6`z*P|q16#jn&^RVB zIX>9M+`!Px#=*(S(cazxw+wCJ^crbRwsf_bI&`!qZS0V$w{viD^T47vQjcDq==7jA z6~w>IX6Q^Et*ksw-`&>Q2u;uA|KMi>@pSqr(bP4u_YR9mNJ_x)F3{D|K+n+F*u=ul z#nT&=*vO=ZN5@14xLO%Z8KWjs6{>LPRU8EgEJv?Q?YXLK5PswSesuevU-CX<8R?TV zjc4Ea0H)6IwvuhYudMUInZo5WfZzN|+!L7ie8u|glJ$k_^46|hlbgM2e)^)M zfT++VTlQ>e*uA|ZebM5~WocQNoAw?)Dn5F$t#aQ#fByOC@%;mj@BexC?!$^T^)(yI z)-Fj9`+2%~c)ELd`v&9RTvt0=7w_n(`74XpYYW5)-i{txq9KYyl>{Pz?c9(^TMNs{ zmM)(Eir<>e68T{6dD@P&hf4?HH&c$^6}|Wsomi8e{xYKw%G54_}pijhoMO z)%4)#cQ+3fz}c6(`_cP5&TqPob!&xM|afHTk907zl4H1A8C;^!P`RR|@hf?d8@8 z`;CVoIHJdamzqEuxdP^WJDO^{>p1TI0pUBYL|y{AobEgqlvXZ@iJ!w!_Z+CZm#EA2 z9}#u;5_Ri|x;HrLGIG(YBcL+WT72M@l@zYa&jorB6j)5`MS_|1FDCO)jg+s7$0&|U zLX(nZNdmMc5taqLYvD}9P=YV@a3Vm_=!HAF9+o>aG6 zM?`zzomyR*5||A=NWP&Uf0|&bY}ycfkJEQL{0DaWM5;vN!3)^=fi^lGy9-k>f9uCCHcxu7OE!ZXyxbBX!f#S}_)QAxJ{jOJ z^b_|fYM2>Z*rWTU^jBeNoKBu%4;<9}=Ibx7fA&$I+^xp}IifBfo?sAsONx(WqK&E4 z$0 zk0n1FY8S}GF+|)##7~nYV=>gkKxg_GWreW@iuShXUZQ#wMq5t{{ZwEtPhD|LLdvYT zNO1_-nedOsCzgpBH8Xj^<)_pJR`soPCXV8$+pQ)V3FtC#8=k5?dlk5UKD_nhyEQl1 z4))KtYL1;~+jH!A>&dcxon36#v)@jxU1FG=Uz}Hg$2pe25g^)-Rgzb@4)-+k^K!B> zGv}qxiS>&NUR1fQrf%Dgx+yj{EgNG3dosy#h>nSBF*TTXhnVK+53r{!>Z z*K1ET^lp7K>0Q)v$ki@Cf0N{k>KZm~>@H`^Wfjvm?RYbAlK|X`Qv_VWJ7^1irygoo zS|>X6R-f0)%7Oc3**9gl;Xz_|^w}y7xO7FD=5KYY2LksG{4+u322Sj@P=bxz-W@Hn zUfwQoUbX{q95(nFb1Y5cX-LRu%W@~FlPd{uwyGT;EI%5EA85DyGY3K&ATT*-M zEW!35Y26)&K+aqpEI-i=*ecamlHGf+;~VOsL*^JEy-i1tV%~=PPDEPX z>J=83u!X}mmTjoogiUxkX+PmfyKBRWK8si4&bW=o6+JFyjHSO4p0o$HH-of-x@TnZ z-UDmL$~!-^($f~Fu3S@6J}Z0`?S-6vzq@hdes4KyD|VG`-cq-xdsjEA?!EwMe=P0= zt)bvhbJKx+dv@*ER=1_9a${+6!CFMrvtT!n;fo3e&T9Z|k#C3-AasmG1Q$GJkbPj| zMfAv(#g62j@noFBX`s9s6Ceqs4em)?8=bqWlfAViU47z0#{>to9|5J+*N&jVLVcR9J+oEq8&5W3*4Z$EFnJZMoFaWstAB6~>W zMs-m|shqd48<6%MRXEUyUdT>*!^MPE}(uHT32>UN^2qzyRy3i zxv~3%>p<#t7zn*RZ^rIdgRr}KV?kcl(mw1O%}SgJ{f+=fu#Yo}O-zmP!=hoCIgj0l zsMzQL2NO)tboEf_q^Cn(x|$v`4Z2#oX2w%Qqjczp$yl)F%J=~zgKW)MjfJmbZf1sY znx(msj@HysLV=2wl9dHA5U_WLXljw-or+RWI=+WC*6`TmF_{Rx z>*bA{o2!RUK#;$uC9tces-mJQRg=MIc=1N&-oO3#7i+&q?)YI_ZQI+2cOPy!_Q96c z2c6RAfBo8)yVxLUO;KKXSs64G0z?G`=|wsDYu2q<4QDKUdHS5?DUtq>!3)Z_Y_7pv ze{*^1#*LLVTk2|S4u}sOZrQNyuRs2{bN}}pk8a=l_2$FM?CSD$>vM5r8UqcQO;R~Y zc#xB|rIWLpp3)Enfl%lgGczPOz*V3Zzid&eue-Z3av`?PK3+awVqZkiv*ooBTTk^L zRl*t$yyP=HOWT?DVCgMx#3lzXN}4(F=JbJA0ZR8phN$LrIrzyos1kOU@Yr?Q(u>^} zEiYm9G6R%uS6&amyS*R0^=}4mJiuGYfmh+3bLW_|-<=Z?d?j_FrhfJcg#21&Or9whuFoRxSeM&*0o<{?-Q_BL#}lzgERZ~J~*o(CudhQWrn*4 z@b^>VZ(Z5|{>o4f+Rxwp{ruhgDu1hl8;{X}5;=c=C#T_8@b?2*?Z{0#VfG>~OaMmF z5u~o5Xv7YD-HHlu^R>K>zLM=v8kBZzSUH%!vFQWpOLZ9sb{*pA`?OY2_dDP_1_lFv z>M1QXEhDF}By|DD-VeauePA!vnxLq6l~!-50DHSid%)gXU@t2dxkiGwaAy){9$K0Y zz~$!jE(lygiR0Co8A}&0pxgsF4U{fp;-nmXv55@=D`3RN3tefHX0 zN%YdH2j$L2X_LDE(@-vQ1AG|I5gq_1&D5~Ifn=~WLV#7^9$3ywoT&?oK@Z`+cs}3%PC{MeekP&Xm3C>J+2(Kmow@$1$tEm)PkX6+gX+!f5SDJe^5g$G6lFDk96 zs;R5rT3ML4v24q>`i5QGcUv^K94fB;>%slI_y1^kbobuPn~y3pE6VcM=MZn_pbR7d z-alNBKt$^;quB!Y=CQPDn@bJG_lMuvqhiw|&_IL*ZgsSUp_R)lV&b{Q)|?6;9& z6@Dy3m65OvzlRD#mA^$Ec-=l$@U1i(S+vb}w*Cv2_e$k@n8)&M=wW8La5ve%Rn(mi zJ={|IFIcV|L0DeCCJ%p7p<{Qsu=#Kgv~WkOsO4BzpB$zETu;8j)*TzWpoXOt(`w{Q z-Z0pGhy{~3pOkFstWr3A?ws`O59dUuYKh5$J+e~_AAR7bZ(o#sS0<4I`CK^<RZn9BFtx+0kJ07^m&%jD@&$+ykgKh%TwhXMzKt^+M4!Ij&>#hh6^k={dZP}U z4yLnvz0zokog|V^V-FM$P_0FkNZ=ZbY*wG`c%?Ei=jFUSRrA2FVGBc2X zSU4a41F{cD1kdb=mnA61Ctx2>nk-C8ME*e<&&ElS0#*c%k#z`VL%K0>V*}N(nnj5) zn7&TjJra5U1>9cBngPg)FdVeCyS1JpYK8+O(_eBhR)PiwA9xzmsEumy84YcI(ndHY zvo|6rz=s~o?pRLXu8h!-olc|>kh`%GC`9BemW@H^4C~S;%R?o^v`Dc(>|RXmb@U9$ z?=&?vvqH6{yE}fTz7n%%mvGc#mO@xLa139 zrPA(Bc2?#_(6rFEqi0xqU}HKOJBQ(3cBVvHnU*0J)YH;NUo%*&HN!|tWwMDgwlPdJ zCj+dbM~ze&rmQFuDJn36kxFXQO&mQuTx`wtCk+#g)$_G5(ovr}iT=DXWAW#X!k<2R z+!SpyBz+^};%CMs%}EkF7#WzLHo^{mva<)qmF`ZC&YnSGkx@aeX6oZc4nXk}wHL41 z4S(GI>wG?1W7t1-l{U5Pu5aAG`^d_s-=4kv^S5uCvlnW|!I-3i&n^vg}n9SNEYMK zw{9Sa9|6R;@LVR`*+=3%^swI9>r1p$J=>s(+tdW(imJ5>m!%KLL7-!9XDCVIfjGWK zI6jcf;TV6bhSqgGM-`6LoESvo6GY=n8ND>76D6SWMq%~-mxnoB+;Z~{EMOkS5XK{_ z4{{zbbn*K2GHhjxpgy7lmFw46SJ&4(`RVT;MW24Kvq7@`p9aMZS%X=O^LyMCLMkGv z;aR+&Sj^PDs1J{wtXtoQ;w?D2M=0J@v2j)PmKq+#-KCNZ*Ekdl zlgF-$?CPhPSRawzGY+-VPINVgHh!dxdhma49{|zr# z83i}6h_R$WYj$khP>M=Gh+;1z3}Y~~Y1mZqjEaUnUn5fQZWv&1- zR_^>#V<{6cEecD)mWEn5nl!^4M~N{H#2X%m;T`O($o>^#e-0N?t&B{~(OW??sW(7a z9(Q;J!qht?p#Q>+cnJi{1|wK@ryISWg1eFd816*r(7#jI_0(H^6kfJqHhp<#!H7?c z5eJ}f8aK5no)=V@)aqI~1|}xP#)jtR1{3rg z{QbS0OeYN&3Irl0B}GM%LbpIodAhZKL{yl+v#I9TaXOYmY>ly5H)Xz3UuJgkGk3b(U?*QsBiU@Evo(}ZFa$wY0&USbs zdw=`uOzsbVG99;$)YaG5RF+qi*JdBT{rKs_TVFM2r)tg2DawHeE-AuBEKXl!tj}Dz zCMz>LJtJe;vgNau%nlBW_FGVb+*xJ$rp=r1b}QLXRSg$H+_-!H+UmdVKfL?kQT^Y) z|MB~+$D5Xylwy#vEOp_$6wEIWh>n?=7!~N^=-_Q{ZiFm@lH$-I!l~9mj|guE7bm@h zl$jBpkxn)-(dM23-R!74D5}^DyrOxc2TgE|H>9lS;pTSI!c+=cc8?+QHsV(-x`-we zJ;M&&k5n;-zvwVn-N=5NoqeqNH7<8o--mOtS0*3PJx$w{c7N#|NMvxiVjCxsb2y2- zx0&N|_g)tHU~pLh#)Y&(wG#KO^Yd^(S}u^;W4u0Ac&nGn|KOruXCA1$rLmXF8{SOi z2&dqTZ6~CgI;s@ToIBTb_UCh=w`)iqOL=iDEf$pg#%*d`FZ-dao2cA#a7@#C8wO*! z=)wSf{3nNHMLcF2FZ3$p0bE9VTuaqccotaGC|aA_myO_ubM@Pc16y044p7L~dXB2J z#ta~G_fcW_VW#tO2YXIbTwBxJ^Nr}+_s$&YdY#F27_JQ(8nIN)WTtp%)pkxF zA2`&-BY8*tZOCIavWe*~-|{7k(z3SJz#%?+9NM^^ZlLl&-d0^xeUj70U8T|upL0Mi zd|LSQ)2G1k2ZHm`57_r-ym#*084&rzaZVxc-@Uzdb7dJh#;eJI=DQwgGDqtdY#fsy z!cZ=mN$SJ_)p(@RhN7^CvxpG{MrTim5*-Mka4zFN9{LzFA8;7cc(REhjFEs~w6V#I zIyfopVcLOvGX429lzDPjN;=eq8k#b#3E11x($+J!@eGZPLg5cLh70iVl6fF}#@&L7 zMAm`Aa7?rW*$3PZ#Bk7%pT$x10X9XLkCTb^)XD1lX0|Twm^;}~sLId;5i}b!1tY^5 z5+g;_2br2P7Dhy2tikbB_`Om%1Gx|ce&rN?{~~Wr$iD09BQQp5zX;$<@GAHz_TReU z2s3g7zq~0y%B<_ZBG~tJ1k>jndhdNa+&yXgFEr4@S|3R;x@W3^445Cn2GRJMxZ6Sq zb1w{hsxeyQaYR-JF0rwJnWd?YeMmxlWPp?A2$?`xG-SA{>TsnVf!Z(~mk5N^!dy)? zCQhAU<83oT3mnF#1eI{Yi53P0OP3s z?>~O}$IUOBR;Oyt%qb)mZy*+z6s=#rCL?3*%FLW)%QMoKFHcTQ2?&VvUQmQS%0d*k zug%0}T;bLlrjp&RzB{kt;r$19|9DjQ*YCgIyZw06QlK~|3!5^F=A|ShBDfxB5b5h; zYv*NUYZhjwBoqjTD+rSO+-B%#sauasiVGCS#CsXqEC{yo>0pI-YNhPReYC_}v^_fy zNZ$O6Fg%D z3%Bg)>xh07~5J<M}!XM zar3WIocL3^ey(`yzwwxAgX*>kckb@v@l7%;sC}8t;~_OCppo;|0>`ofK_P%#q+HUp z3FVt5avJY#=-K`ZG%n5=OkW7XcFT?Q_b z?BZa2tgBItSj^Q(Y}`7C#h-!2KNa_~Sklg%m$kF!mD|sM@cw&ePc!dKId$@_qb&#b z?BwziYKo{PKrh4p-2W}U6f zAH@aKob7wfWA2PSzv!kR(3Hqg`~u5xFJKSLG{~0dz#n0>CqXr9!{pUBvGWphH1-Y* zBZI<=@ep}ICo&;J#PUjI8SV%^M}I%n;w#}(0gG=;v^roC?&D~xtFEqR23Hfi%^prR zW;Cg@LaUp-$P7NQl&7&7Lkk*ol7m}Hj!zswW7>f0qwzbd0P$Lt#(EP)o20)H1du=;Mpg9FPB{rH>q-mXU>p zk!ReZg()%qCSzm*#H>_DjZz&Vl%fV_l(EmuS;;d)91NySoMvRDV4*WjHrWhUQgI>` z>l>43V5$Lu97^>OakElaty&V}VP|e+2%pEy4j)=!k&$T2n;;IyVZ>liSz{~=jj^Lg zs;U6XYA@e_<+vxeZrxD<6IS#f>k%`l2O!#R84lS-GnU ziwjE%)~(6QU6r|Xb;j!am8&w-moG|PxOD#9l;EI5|A-~4@?nH-NS~jVv24xy!h+(B zo5W=sH)L#j{PW#E{<^*C*`N1+{`pDuqE&11vsW#dyJ$hm?3kDcl!*j}`J(Xzfe1a% zkeMbTI23|(Cl7bi$?68f6hae&;*;n2=vxKMa&_ut6&@CKNLaO=eIK*gH`p7M?CH;0 z4$NHLCUq>I-Ul!rhH@SPWPc7We=EyYJ$z^1ox_dKYM-&2*PVR!W`RtB3UV#}No!2| zW9eO}V=#IB5jm4ru31}90wya|?LnfVR~~QSX+k_{S%Y%c1=4p(m@l zZDsF48w2;Xg)!*b+7y=~kdW*EN@a(x~XKxQ8a?LrWm;sS# zZ{zc_pUOIk$kKyM)9CjH5_$W!y7G2OGkZvQzNPy;31Y*K<)(!akX5{AFq3z2#sw#k zyEX`@k+O6WBxz-K5-rfpNAPng-S{ghZLKQ5{P#eO3?v8fNN$8_u@(}!<*%O3XLL}i zwszamo^KStJ@fvNBi(~FGFRnRj}^2&-{RMfuX{Ce4O2UG^@$VwFpoUsp)ioQY^mD( z(~nQdviRcN{SDpQpEoGgt*v$)=pPRir>^ZIa{V^0JGmJ|mezIDiW(bS+ejg+kZG}g zO&;yaH3P{C=MV4hX&iYzxEIRhn|h&qi0=J;3Ml`l56a91wq15!a6x*Jxg@&Se*S&w zd%EXNpL(mUl_q;Tw{6)}T8I{*mCKhbBq}2^L6vRD4KonRGPG}YC#j&|{*|bw{9X_~w z`inc|yJ~+Rz%cB60LWRHi=(|A=+2*>p{0utM0^xYd*}3^kvlnJ&t;krhbjiZh`STLz&I$>Qb_2M-=TDtmVSx0|<~RL)$uXaU3mivDB5u*c^g z=*i$d;Oc4<6zuOWQWl9KQ)~^~yhcs5(-(Lw3XhCiG;^x6-MmPfE>_`L<=--P z2o+_1yN_K5@Mg2pY&EE6zB>~w$y}$V@L3r)Nv~)pgRsEoRY$bufaU+gzza$+0bM|g8jwPqqcZ58S?{PT(tn5E!9fV`% zptKjq+_@=AkkwVSOPiT~96#ZPd2HDb47@<3y%(gdDlOblkFzWW5V;#Pp2Ej0Hm;9J z=2z-a^g|0BtIL+HWBxB9U;e9$&aw6qS>fAv-)D~Wa73=-Gj6-l7S*t=zD~IB01-K# zT#KKPaN|_6@KTMeR=MT`nd(rD zLnap&ZzqcGR=4itx@ z(cYW!8j7wkF*so2@^kk^{G>)>6lrGjHitsC!3%+e$1%RW0l+^>(*pvE?T_^eRxY# z7c5@9C^a=EG7MLD4NM#ztn31orLV1B7#8N|<4Em8VxQoIgp!B9Ke+Yqapj-iet-SW zz4EBYP#+f$7fUM_XA2t}bBfd$8ye~xm|=@D#NXLXLnIorB*0SF##&{Xp0&s&D>f`3 zD^bJV-zNoqnhG67xbmmcaSuKPBXxOaxD&rmd%E`!8<-_MzYk=#sODU8v8?0|&eZsa#v$0N$8@&b^8WGyP>g9Mpt+8NsO%}0ZUV6&qXuaVmgxz zV7IiUx3}K<^WQY|c1}ar{PYr6Ta|7>LzAtc@a>87y~M8Jh`qO;*i9gIZ7vb}KOJAa zREE#Iabs1Lv{o_yt>bIf$vBf)xu|4YK~Ck(r$7Dmqv)Hrn;N>dzi3dZUssXe%jzC? z)@>Z_{q?bWPaW4a(Y(K_PEyxdE84fywe2QYJ-lz|m%FdCo!u>gcFri`L0ws1&V!n* z#Zk#)N=ADzr4ma)Fy`z3>b;Sl0 z9AKqn!JJu%ap*Lo1|2q5nQ#qKGf9GEW)_RS88&$$%w|qu^JX(`K8IlWE)Yja1OZYy zknQW^>E;4fo14tg>s8WFep=epTK|{~4(%66$cbQQfYL0k-UH7ZrSZ#NO8Y`V6QyZ@ z=!NB4G^tbDG83dsSMQ*o88{r$C~D4>L>i#)m>?c1j);m0^G9HVT9aXgprF^s&Dq(_ z%hx|RcFy7ymtcECeNxrDrtZZw-Hi&THD`JF0**60j{gbMv}M*-?3xi{TrXGSdJ6iZS>)DIx;x#;`lc-{e>U>ZpN45M2Sw{r8m}rxIVPtM)9%#AKvoCjVH=eBILw$fMvWM)38k$*W#TwQ)<&pK z&@?o_-wQEs-2C&fve%nBaU!gZv6O!sKVi~T4dk{>%xzr#q2{Ba;^w5zk4L|oi?gkT zg}qM*dL_gt-$Mjk7y(_)ibn={+8JpeK{rMXAq-d?U8t9Mh0;w2+X@OYx7F`IxO4li zojdEdLGf&@*<4*xTDT@NJ~n=8Y-;w()vMPQkZ8=$Ua@G!!o}$sS<6!wr7c}DCuV`z zF(gFa$=BP>J2ZLW_N}|aeFA)a`~pMbj3XiwXC{Zw$y$-Oe9^v-e!KVWiCn+PuyF4H zA7>{wXLEZ;^y-8Sb{+7e|aCIkI7qYS{ycksAfpw)XlcoP4$+^M{ZjT~ zqXH1!^E#m$K46-q{e*rdSJiCk&N674`mO)x`3Ffl$ zit5Gb=_^oN&pFUU>YUu!m)k$S^=4M@M;lu&tDkpv^Q^wavHJLV*%1k;Yp<$*XZ25D zwG!1GfAE2%R#fv={u#7wU*x}mt3s5~&zMq$Sva_ApEhSK|>IL=2s?FRKu&(xHDZAlgm>j>zNv$Ag zZTe9fc5dCtF1^90Ga^Y=5vqxz*dLkb?&=|=f#fm|YhNFd)OdG`>0S|a zVJM?E9as*35}^P_Gr?@A26`i-5RgMa8KKtzu2YUxM>{E*q7iBCN7UO1&@E*<3 z7*q2;-=mMwDRXHjI(-16+aRSc%YBaya*}`Sgzq8i8ww6)Gz;HDcBkt$F`B_(P{Nzg z&wh}6kGrnlGG7n*>IRSJQShG+?uP$dlrP6Klci(W8dIHEUr{KMHhFSeYAJIXFOGYpHAL>ZwnjIBDv13=2)oOwmuF zF$Fo~kz*!nX``tgqf%Gj;9w;$OI@sk$R=7&nv4cyE!`RT$JjeKapyxKBBB#!B}Bq~ z@%Hs}arQtsS&WZHzT_@4oDs8ODk1)EHiqh;zZ$wIUcOG}mpy+}l&##qV}9D)l=%zh z&t9-_A(lY#T+1#*Y4L)E8gYx$@w*m77|feHcmBf6rAwD2po%F8-c?+9bZV@fIK(2z zC&W2q{^Fvnx&%D%(7253`iOvtpVhx}ZQR~5Mc#=naPE&!(k@w%%IuT{(jb-es(8G6I| zoTynTu#)HVyUC6~Vrxx+uEf^q#Rqz&xdS;}|{WpNvO@(~|ZZBfy<0;-6m$h;|X%OQ-b&Is=VU#)8iH(wzNv#Z4f*=e z3b$f7=T-#ygWP^HUllq6LU5)2A#oShp-1w?@nM)l;YOW@rx)Wn7G=5!kJ(w6nOiw| z_y&p-Q?oK$l6=fjhhaDa7qCrfF`73k{u^Q6KJ&rlPk3jUW_2>u=g9^Tw&Tt-#E)52 zTE4i`dHdllh9fJ2aWvkO0mxlHNI_RrtD$2;PS;7?bdS#-!=pgxjUt9H=wl=ZRBPjT z5e7rt0a$f$bHn-5@bF+i$as9M>3k{bm0V>m_RdbuScJpfEEi8-A4fBN&8bt>$zRsR z56%=zcXnuz!@jh(=Co;=`jGy{=p_yckB%H0>}mmf zP?wXxqipf&%oPX};}Z)dQ_K>rMfoMUSxZuvOr4p!V(E$%S=a~7%*n{_V(k}MiN&7oj*jjg{$lsAxZvf_?*8@o8T;%(XGd4Z z%MKa){zy->$)O-$M^9fH_W^7zXP6k9+B(@;qB+^lT4)jLu4gda#Bky?b?f0m8*e-q zCc)e>G@Svup8n+tE9}|+;th1|to{>a4ySp#zFhh^ZBN?oOMi!U9Z1*WqIG0245Dkx zD|9X39N{B}yWj|uc9qkW*RDj@qu6yOgW(X-wW4Ap7b@mPQY2lAOI$$L0~}r1bNA2w z$-`Av$M(bZ0SDKQ%WjrECSru>!kAc=?OW5L}&2qBt?5gXo z>#h|wH`KKK2V_--yFg8ro$b=yOyj8Y8Sw;G+OFHUX>--tMzlz@aAf@uWWCupmXndA za7l2Pxx!u*TwyLlt>U-Y%hD@?tIUU5S1(`UjfVGN3!gZ4Xx}abKsOZRtx8`E-Ado* zDpXDe#Sq8wwI@ZC47xH2O7zFDM-d?m$DIx#cd{CXI^ZuLQ%s^23mN1uSfi&4XO(mT zQ8>N20zC=s;8D#F^-Qq%T~ah#%IS*Ychn8jZ%)#~Uqf~S2uou-h*uQm!fEi4c@LvX zOL36DkGHqXR}tU+a5aJjDEJW|)hrD$=DziLKNy?AxXR$=>V~l)Ix5{9Epes-R;m>> z3dhc0k>Qf;XQ_|jAP-rDj9-Q9oY!RR+h@*Skwdl%kd?jxvJzz5*xSzm+55;)kbLcf zYzJ}_lJ8Z%8_3w{+^$_cw`<2ID8N{<;^k|EQBxxE*+DDiet}ft5fF@Z!T>inuOOHw zOe8KY<4hixHu5Z9XVkfXo?vZ z?(bql3os~^v!g#iRtzkC#Q=P5QClZKXk|=r5UyZTkBE<_C+hWsAz_&?0X|rV6KX?) zeBfr_q!LQh)D)0$dlj`$+2LPSUQExbTDuHyPuW`G>KrE5d-bZUY&54WON^g8C4Nc9 zl9el0z~EY*nLal*H70n$ve|QxpqRg4ZbEX9sk2yY<>#$uflpoC85ms}8kp(mnpruD z9jxXQta|YDcS%pj3ygE`9INaUY%iZ3=1}3(XB|hf$kXc-^%o2ct#~ucF=i z_w4E3D?EJ`{%zaA!Q!=`Z6yY7yPEs(`h0+ReF3~4ljHT6e0i>3d+-7FTW@}giCb?@SW?UGkUwHLP1|bPega#S z_$gawyJR=pIQsmGK%kXdTn1V~>A$yg%BDgHMq;UDl z)gBO4c7=r(FzMoj3+F#L`_6IrwlD%JO4hB;fL_H*Ulq63``xlnVPS=oS|N5;zBVyL6q@P_QgK{-_J~l0th3+`ZQE> zumWzXF~K@81&E=@6uY@05{$A*2TOzL<42F3tZ8bGTFS7*g^S$d{j3b$z)%-xII?R~ z{u@Kl8Sx!NCooEbHQo(iZVC_*Cbimg_sRbXQL+Jgm*jYeG6_R^AY`AqHMfb7Flc4ozaYcZ>;au*jAtt&2Ezn)@M z^s-%%iSOEZa~4faOiP=Wx_CbJ=Hb>YT41dkwFncpS+miZIyWJ7oSw7T+tfO`e8mx=VN~+(>+I#`=<)9i-A4?i8Q9;PM7;-z z+RM;A`Kz;Yz|cZzCA*&`gw_y3kMtpw?hmh7S8yZ?2;BjMzG&$tg~}t86lz!Ab0G9B z9-$h?dlA}u3`73@=MlPT({p^zh@%DE2rOr3FwY0XD1P~>g`tun)xPz?pR&be)Hxxy_p3Tt}0tBSSMMpj0|~B&igz-ziVxH zvAwfFaa-kJfO_IaTrWU(5f;p~`rUa%y$##ShNCd-C{^ zroB7r(EO6Ka@pefb4StoF{Q`2;-FxL%QAE#SLgkhIUg88tNx|AWmhv%1H7;heE7s1Fia|j(!n1 zzKA(TAlkH$=|w%OA33Q(+|eP%ZwLj-Q1%=6G(ZH7Ko0BR8y@u!Xh-vMcXxAyh305) zt~+U@%BYE&rgpBLKEW}wW;@0BS{nk`ugXvt??4Wrv;GT08Jzi)VsItJ0V$rK%&)?m za)5T;eZ~QlMR@H0P@(kF9}G}RNyA6QvWPAvrNaV!ynX#c(3_6UEiSAa8SG(e?dTm6 zflLA68W*XfVa_C_%$+-Lb`t%h(c<_R&IO+t85$9n5FHvC z7Kv2HFjV+>czWU=5g-ec1ZV-oXs~y8w6SsW3Zc*e4#nZC9_sIGYwLtSM+nM1m2roT zGJ;H~YDl1$qlx;2v7^aEMSbss0pNVb>V3WL^DpC8Rc51p1}pfvz-I31Y*dvk&&G31&f*a!i5W%lwryEtvPd35)x)IiPK{fqhsRy?1DY)?1p*j8e?FE1`87_ zQ=EzPX^?aNLl>qoQnP*zqhTav7Nn(wVP9TfJe*^ zx9WYz3Iuw7=5S+|ro`Bona$8QH=SXG<{}*WP}lxfa-Og0C+FU@-JUzSKlOlfGEq~sRB6?!Edv!)?+VZTtb%)MN4_lE01wQw3_&j|0$Pu2O zv_8B(Gh;3i1oIc-wj1@DZEI)^ErWAhR+S=F=J4g`KRx_WNbu}v z5LIRl6rV%rXd5}EOo>YIb~!uicGcG-H9+v(Ut4qZ2f$NA@I+vsQL=mFyJh|GtlV66 znrW2o61H;iyb5^U?t|yk&lErT_@fU$lwMW-5WfOCJ1#3+x%#2(>ewrnE+FOg?#VVR zL~O6AC|)seqg7VR*U*_&@VwF^3vOPALxhMuY{xnsvt_9OE?F-b{Of%J9)s z^ei1vr4tW0`^l{JmcZQPUn+KsOmoYee3Pu2=kmv;T8P2404-sL39!`!f-oatvh_TT@#iv&5Vl)4+#m6 zO-xCF9H8;e9Gn?R=6W_p&csFFps4tnnC#<=6Ba%cdkdr?jq9>ff(ma(I1f=T||Q zW$Bsu`Akkwc24%Htjv`wGBTECtX!6wJU3-p{Co_W7A#0jTe1M7sFb<$Qs&G~N{&xX zo;!PXR7^^cYk;SrqmhxhB|c(JEv(GUENvXH&g~#}v7X@)bL^w4i`QUjP_ z3R2#)^NNke=Zdelv6E9mOv+4OCqEm@-#)9~kQHY(M#CRnIWt3?v?dN8itxhtDVh_; zOddaK?8MP;!emGFUsa;>HE7P|CQN^)5hnkD!0e(&I$`n%FbM@&xDuE=J`j`J36neJ zn9PU9+_M%UvZ)g$C?_$AlHIGHa1!$wD0xaw$+vqcSxPz_DJx!L77-=)^-=QH+2ex&IKLBNl6=fR3(u1754Al4IebWtp`Gr2jwbmcz?9L`v?nA zW_c~-L5Vqk|3h8W3{ZXn3$#BN%hn1vx5?Hk6%=hC&7>DYwf>iL3D-tpOn`|e*P)P%BxpDi7nhayeLRCUnhG#q@*QPoUv)6gp&>Frhe9CRUxDO@9F{WtZAWnTh{G`EfU)|* zmjN&JIDXO@8DE$Ko(OX}IXKvwX^k5(Vv?>U1d_K;aCB0NQ*3}8bjANn%iV{Fmblh) z<7=Gh`G1F{(K{#pMO8uyLR&_K`MKd3a9Aw9rqXB;-r`~=7-Ylh1r#60N(w}ThLWoZ zNf-vZ5?9lpvhmS@-ZezYVo_=yPN#|8P*HA=@F$X~K6t)Ipr}ka+}{m#G(l3N8ki7S zum(I-Hzx-hXRJtvhvBG#gRQMQj>~zuI5;@rgi)9TKdAyxa!5#!ubY+Dgi(x&O!cwa z{XuGS_|{+8uLD-CTec!Mm&p>Y$Yj#l+Zi-)tlovYZ<+0rTy{{pI-_@tDz zUi#(kgUA2;{ZHo~zJamPZtjU`jsflg$+PCfCxiwXe0zLjQTF__1u1jprNz1%>uRbF z9iuX881(O$VWZSWPEZ{^@?SC8F304{rGE{;$zU1U2KP@6qzRQDB{hb-1Z7DffpX6tJjE5N&zvJp zDndPvcCzFJxybpX<9UplPzaBJCj$F5;-Twa-1w!i(ygfvdrAI z1x3Y&0ZNtTenGjrRd!_hX?U84tE;Pua}#Efn3S8Dt6M7PK}-JHt0k{|cgq7Gt6|7H}-wUQlSvIw-1f7>(VcJu8+L-`DfrGROCk=bH8G)3a`M%lp)&m^0Mls3&=H{LI@Sp z_qxq0<;8393{OP?3d9W)qeOA01oVH&kUFJX!Nc%qr0;7y5Seg6m{dG8goYD%fBP~1 zDpYYm7k8{J;A1it{#s>(vJbST#I|MJQ96;dHpEyRmCDL z5rBVp`^x-!KuMXuE~g+d_~o{{Jn#>4aCWgZm^^ZfwuP$?2J-&m*yP!&aX}77{Y*sp ztEE16wj4-7qHggu1-bjsvA55(U;Xs@mtRZ%S0oDlBgN0D><1Q?Cc9AVC3|J&!N}URP^mMhR(QU_3qsCw z&3OVRBgG3adN|ve>8VfExAq9d){_rcE-VQX;g5->p=u$4-j0S-$Ee|Sj;e~P>XTRa zIPxqj+u@&)ziip6EX>o>mUgG9E?k^CKP4t9eq!|OdGi)C3)n@bn9bsios4$sq*)2E zGm$I^!~I>CFlP;WBMWS1*x^&u(%IS3%EZ>j!BmWYYb?cCtHt_b)D*FWrZCbdB%@-- z{%T*ppkOZ#|7Fqn9=K8$<`?K~dh&ebn#|d=6JusaIXc@S;5=1zgwoI}}1)%W-=TQEYwlD4O()$pQoy+B9JRm1y`fFsQ#zVF8!$sIR!%LgUSXqsR zZqB9bA(!&ys{TdSry%2LT!_R&Tm4io8Mh81<9d*BMdKd4v)O9lnR7SKzTj-i6%vk& z>+#I~8)SS?dZq05vcHIok|ws9COsPmqOo-#8fEg3{y3nK5}>QoQC9xUfEbL zN8^qI(t4)uWgTAXd#Y-Vd;>HBj7I@RwPOc)Fjhk|R#aE@G_t*1yn@kAFBcUBUwm=n zhV)Cp4apZu*RNgs?2}JqA1i$F>8H#mio{3Ee1;WmSZfARsY8hgI3U zcl?gpO{Hk5PEW$f64|644v{Jppux8?Em2WMdkE$NG}py-hSAi=1*;Nu zTog^BGA^k;hCQIbjKtkBewb?F*M}RPm@giRlSz0d-4==17z?qCgJ%Ou@;q-B8 z!<9u(1!|%pDr2>bZM~v!H9aaac(}Wzg`FpcJy4!fu@2fHa83xPVDQC6$&8a zQ$~*%qiF%DiSc|G+)o+(HMwGj*%1}k2Okh7GK#Vo1V7tt$oDl4i*@U^+ zqZgdg8**jSO%+WJ$UWaO}@ngJ~C#iM%Hj@G;*MlLLNb#Qa1v?9C-jkxHP6oXwJk;=v zqvFb5G^HtB6qA#vrzs7tf`&9b5=rcU7WgjVEb|a%qJiy2x zU&LG)e(7R6x59Mh)bY_r4mNTR>s3h5Q68SZrNG7u(90r7k^zg8C++r9hnX%|NaI{CQsjwS=r(r9ANn~MX=s`{`S=1LzCn?Rb5xTfJa9FE zdrEUKG^Xm6|DRzf`-Sd(bwM*SKd=KeJYm9aT zeIqkVnKf&}TI*O^n3|a2t!ZszZEff1W1}SB2Kso3~jv~c0<`EwKF z#j&vyB4^E+J)fClK5uTytl2cfPQ-S3TCt!nNxPRv#c1(gPYYkyzL-6aVR#iPQU7xPK4}*ANT0ZF>%t zD0qiZ$eg7>P*yJq$z!}!_D9(xBB88F)=NS8h;K$AU9&x$*Fq?4c^!p2yn zVv3DI@JoYPD8;D}u&}A&>GtjhQPp4;#;q90Lh7Pw-rFXrXZuv;;PIzUvC(Vj_7?hp|K2R)M%`pAv1ht&_xMLOsjQzu)q02M-vt!IgCU` z=tNi4pMZ=$UN8trCx!(2Nqy9)z!aky{01gIJ|LsOx5vkbi?9UYet1N9aDXpPQenH_ z8sB5ip6+(W+8VkhWL;st6COWXbyk$O)eOYdF_q!q$n{eFI~@149DDn0`;|}drv476 zV<-gl+6enOa_Sgg-+hWbpnC{X%6?@)M+xZI`QykRzW=^IL{`p%*}|OmzKsX79e=;w`d{mw#-YJ2OSp@6Eh(Sgq)j_lAMx~l$e~HFe?Rf z`)JBY;GN+g80Bx{ZJ}*pV&jIVw26h4rL~2*m7SS|xs%uqS9IOym;L9nkG{Qm=icvk ze*O9T>z|x&OY(Mz4vJ1K-4SCt)6+7_!qUNi=lYDa1DrFexSo8I@P-Zu!Ad4T20&DAfem}=qM zXMR1~C8yXJ11)H*N=PU8=~vhmg$dQHn^Bge|z{fB#w z3W^5~tuI0~zO~cKrx%sfqf%d|u;<{hj>Dq;Amu0hiAlgxY2Et9B9e{t#=8Hb@F0gu zVf9MJnRQ`ZvH3+lBaUtL%EsE-JzQ_bIJ z$IILxhPfiT`r*~f<1V$o_b#MPV_kI_-OPa3m;|pemc{uk1-Ok&5{s$z1fGz1NXr$Y zyef);Sd;{g;@U{)01SnF@Ql`f$b*qq*n6m!DcbG}DT#MAbR+#SZ1MPeG47LHogo}8Ev@YxtW9(^H1)8e?d0hb z6hUl^@w3IYB-ls;YsSLlb>X;VDQ%v>s$NxC12&#I*U!eDHNtz1Y0`e#_704&z?Ig9-du%sH5(rvEwGorYKFGgg;Az(H@8BDK2Gc zPMB08&VP5S&Kv5S$j`cz$0YxIj7n;26&jOO&o6UL6k6Io@{_{q~jNE1tB&*@x` z{=^YVz+@24%)l7Ipob_a4OPVlpc_sJjOGt%z3Mr#-7#&hwa=-G=G(*%7X#3W8t z;AG95*>N$!F)E^+9020Yv*Kd zY2$)lI=MJtCgY&5?zU+2txrGs^80(wAKv@@;r&~`e0|Z+-qAgJ!@R)xKH`+vhy_m0 z=Gm25vu4i@M`Sh-_1tr3;$)bOrTQ@SYk%DQ_OthwS{NA{SXxc_uaKl<sZe0r$3MOULl>@~ovx zkd0hhP>5Y2qU7;^rzGuOEMLaWtPAIIo?|~HTVJE(uES82Z9FDF#rzz!_l>O8L*B+SM-|)}&o(AETOdgYrTMuC}Hoc%s9*Nvq$76Ee zsqXq`b&9pyHq4X-@;zMsip3Yvxjf zdqfyu;6cqrAt4}TvDlBK2nyZQ3`SH$0S`JRXf(a+Fie&YV-SZll;9ZQKd&-UfH==o zLS$5IIL;ya0FfyB03yLfIU1s^Z(4ArF)lw%G}PBa z;GHgs;fxjKL-8NRaFT((y0&$6TK4Ldi{~WINsjb1*VRO|hXImOQw(uD9L4|m4?mo- zj?Ue2U|Z>`1Q*>A6UI!^(1q;8o+GNhP1JEg0nt#L0zEw_5obe3gm~NNP8Z}jWJGAF56WF^yo_~Cj9r~w?J=XaboTIc zaI|r-b~Lhb2{Y4}p||my4?q9n`@f$*`uW%UzyJK*_4gcH9Bi#`TkOAJR!G(;9S(SKf$nZ1S0Waam+UHIhuiKZ4$YXcKAyNPe&;*09XSZgfcEyqV` z2hwgYeF*XRQZ63pOlKatRP&%Dd-h28lGi9aQo}LvVDZ}g++{g=#Ke$8JQH8ENa&5- zHAprptf@Q2>&9uly0Nr@&pgUIlU5NF%bt^LJbwC@v)#OGY%A(#;=|Gl925UP#?AvQ zs&o7LGZe)_6DiU`dhb=5(t8sWdrM;P9Yp~dKu|1L0V^nAH<e(~QYYZhB%(G-`5_ zn`Q$BX3ja^+V7d6sJZ{|xpD>d!8kC#S$prb*M@BDd<7BDDw>2N*tj7i{#K4r5ksQN z%Ckl+vRAP=OxFhK$yWf;h-BlDvbji9pb^Zjs_gYgkABlF85s=q#7?6q8Fw_p_$WPA z%tYe{>|#|b(Xe&ri!{`%Kg3#%yUtW!{Rpi_gg>L%h?JzYMP)S?yIHtTWZ||Yy;;~F zcc~Z)`O*OuTN+rdX#HCv3%9SY+4n^mx$&=PoH*9dRj(U`04ZuSZmg*5jl=hW!(X}u z<1?I1(ne+X^;chUD6!#grXu@G-7hec`5cpK)Ycz;bgc_G1QM_D*M*OVUH|CAci*{i z=J*j*)Ro1nmdtx&8f;^fFv^o&9ESuu9BP$}5pQB+p^?#$a0mxovLs27tVcr^N`s*A zIy4uRPFhq?yF7PpchVFUqXdc(x(J3HM`!O5kc=5{`H^Jo%R>%*MIAPAA?o;>$As98a!!C$_QU{^%)R3AI3vm z_UPu}^w(d(!|U+t@ZV{EkE&S7c4;twzQf&xm+?p8-gB%X@(8Nq9}39Sc!umFdSAj+ z<1ehPR;$Lgn`$yr_7OCr@mpe5Es~K{)g-&sWV9Kbn=#7Y5$LjD7yR6CH5CF6Ss8R! z9PjX6Jg%V*!QyuG_+_%qo7OLRWBRzvk%1ntMQNZ%!8@7*kMszmCa06t&Q6}ArdKw$ z?5~^_X{U*(4O1vfOIv$;Te$I^oYB+7>Fm&ms8MNSCQd~BD#pV>z8+3C#)d;IJfl;w z<&%<}N*10j9JvwF1|)>JTNp7cKGEf07*h{Oic3w-nm9FWDyYa!w#6|Q!s6J8<0fRM za{~vP#l=yW!;n_&=3-Cp@$c2dMGkf!9FRJrno*b4_Tl1UaB+$3c{R65dK_HrdYikT zdAjCUg~-Jxten0g`%U&ADyMt6xI=6`?yPM-t8C)cT>Ni2U%~ZoQ8k|y%juHR&R27> zALHVt#r&cH7;&wPe*Fqc=@+=zriF?6BN$r#E8pS$X>ISi1~sh*RO)QRYj=D97?R6eYpg2VKlinW2$- zjA<~*$&*c!VAzSpU>L&?C%BME#DNZM)Wk*v2L^{nCnUy4V|d}@ z>gGZ%G`FB=Y$*bYgC-ZGNBMiWy1Jpc$oaUUen#j$L6PpG!mtAhaZ*q+5kj>%I1fEAQrCc{||;&E)IF?G;1*ehD$Jr#`tAi0Y7#a zUT5%HLs{0NbJ9lzxjEWe7#pD^wzB7)G##K5mCh0u-W6}oCJ0ov!$#3?r_lV>_09V# z7feVF^K?QGs>DWNO-BSwtmx`DOJSyjp}^FsGpFZ`@*N(IgpBa<4|h$6pU2y+-^p9w-23hE za>cD8@Baf;{vd8nGDg$fMfGpDmb2R zII>rS<5N~hUy=P6g|u+|AMkjFYvPU|W0Pd#@8w(t4?G%Ci;nGSi$iKMHkNj5ke<4T zX5*orX5&6I8x4t$P1VbnE?u&7S4Fz4;^@7vRGLxi9yH_euI@e~F6$jC+I3WMOxh}< z@rsx#M2*I#+LzII@bHn2X6jwkH&``_p)m}WX7UWl@+}gQEfm6h$DxcSVYXaBMk7iF?z;O3pz89We!H$wR|<0F@EA42PQzgvvA#mGNp+vb|xdrzz6` zt51SA|f_cZR`yVrjI=}#Iz zJ$TUm@W})Ex$_?cr1X2dFzMi7CjoioqOqEp#j6+3fyagX^LRi>Kt|yd7Gq{ysF$M^ zHur`Y4};R9q-Zb_4;hu!Oc_#?G;E>vc5cz*m&;0*O-YOJcC@kN%moYHQpbYIWx^(J zAz12KS(urc+qs2AM^o5`77~qz+wsGF@d@o|(nC3#L(oGU>NX-VGi&VBX<4xmxcKU3 zYvU3a?jBPl1%Bs&l9;ZSM;c{}qs@K{K-h5tM?WmIB(Ouz^?M=!5X z&k#pv2UjO+M^9J#;n>=DNe{O24e+;Y{`CFNe)zRbA%F6;o#*~|^sj+|{=pcyz_x5))u@ijKzOd1P|h)Sdg!oUNEUW8u=pYnM)%jp#d1H?M!jWogH} zuh4h=ZT6wr_vZW;_4V_4(!ITLd7v*Y`ATKQ;3~o;b_!8nuMh32kZ#+IbyqpJIF0T-AdGxJ27Zju=&mTQ}~z~r0tTAE*t%vCFJigdx$ z%M}&({wFdkcO30HCJ~9*(uG`vKgA%~p^GaY+iQNNC#VrAj zWFE~k9zRRI=TLIvXXZGO-!P%x7&?%Um6+3@{fKfK`-M=Hw5xp{dOU5u@KQjNZHno7V02JBqvTID(>7h6@jb z2R}dL{}(;EZ^gsUfTv1u;>Zvm`JJP z?Q#3W)(j-IvmNdenVL5yCn?;=+13I{z-E}#@D{we#Dcfd06htugNGU8w5WxhGlnyE zI5UWBdFxDU&fgT1gLp-80#!j3ub9xR2W}*Ht0l0?5k8m~`ILtc^Q5YDA zVX6(G33lqz4tPpzu#*K&kPaIBZJ!OA{*$ImoIG}X#z?w5M{_*^eOA+~+>D&Ggp4FJ zEcM`~UVh$Kyh4l~ol1uig%n##EKMGXo$!EgHz#l3U`KRQ(QxqgbwzX4+Y26kXFK~K zFZW>I^$hj&_Hb~F4GD-0i3poKXBG@QO8SRNh8kujk9y;2C%-_o1k^Le2rCjsaIzlEw zEJb7@2MFFD6yT?uniOhe(itQIrr4H*Jsf-3^HtOAwhbDmFE;Zny1jV0izKGLC@~9H z?Owlnc?AUK7ffJ2><~VawzMja>8@_x1N$Q#lHa*{|EX?RiqRFv$^Cd_OSimacbj+A zYStgzOR#*WhG6*tYHtZpDSZdIm72#|w!TBOl(yFYwM)5Er>-zIE_?*it#}NvjU&@= z=twOvSEzW2;+yeu+uGf`!OJ(#D@#@POVD7@{50e`U!ts`H==J;tHbVC#D~NbnS!pu3S1tqwH-s zkG6Qu^vUDL;O=p@Hon0j2;^YoK(C*~Q!hOI+jB}I-K|m=^R7^oIgh)j(_qUsh z*e7J-l2P#{_M9X*pwWI;&Y;NM|L;%I2M;9=pFVnq_N4ruRVCx%=bv6DE}o-8eCKB7 z4wyzZ$O2%5&o`qo9BH6xE>an8Vvc)o2uv32+l|Dp=FMbEqUCUGc_4%2;iCkj7CO=hNixW<7O^e zw)nN&M9fD5d|VvdgJVYqISeth2~5pM;}J@kN|F!W@WH7-Vtlxp6&%-t20zi|pd~rI zzxtvPfhO2HO^<~}W@%9Zsu45TZgSESGZM`aOO#EmhJ4&k&dEu^C+1V_@E2e~GA2GY zGBDiL*)Jf#Er3o^dAND_czHT|xVu@WJ6TDsjY?KZOk4v)eLbCQy?ni#am{H&u$Qfm zJIq1O?w&(zoE)6&k!hb6kEYG2DC|>)$EW1Jws6t11#e84K6U2gH>T!fM7kh{)Ab+G z*w~H6!?S;!^E<@kvw70vgvOOCmd+tG9(e^Cmt&!DU0p9UHg==&%{7WXVp1s7>|vwD z2{jwH^pTS@!Nyh8nAF&M@U7byl%yu#Y&qDXtd;B_i}-Wao4h3ZQ}(kOjtHSt!?8{c z$1XJ+=_U~|NTef{XRwMu5kIW@E`7d1dio;Q3y#>J?tx>~+QRjjORkWV>;=c81jmvd zIPR%Gh2s09C?!>Nyh3!`_7WZI4(=d2UI86{{P8^$-)c5)Ze1?2@mK?6L-z(VaoAS1B$Ncs!;v@qlnw2VlB<46EC3j7mEgfE0er)v7hwoj!aHjRp-mM#p zS1g!0Z33=t@!5lbO0bgM?1Wi-5FK7nD@q=rk7leIr>z+(#IXvEN*tOJS>2o+B~H@v z44q%-4b3h@rYnF=z85xAW1}KQC8jYs8N>EGASZ!M1M-Zk=G)}|A#9p;W0T}$7Iv3& zlA|$`NI>|FX8fqg5M_{VU;vK91&yE!b6NS5bzh%3H7n8=^IuPBN#u=tsjwNFngeVi z09utZIY-1MTf=_my^m0ni`e9DQC4~nHED*^0SA!e;loGm-O%I^^F!-2e_YxrE(KqwS zn!m2HY$f56+@x>?_=QD8`kM|mupb3KDwo_3A~Kz|EorpfKPk$~)B;b*=Y%Bapw3YqBGDrdD)o1Whc|#zL0L4l7@Zq z==f2v`M9|SU?Vls-qFg+-pth0$jaQ*!p|!`R3fq7^3{HuK);ZfQ2(HqaDM~i@q5pf z+c`*V4eh+$-G)2CR_Wz!o0gZ7gh~R12r`Z%Mkc3BT{d&tj4@Nkp)dW$gp9-}cTW$m zSGFsenylF-XKM04vwI=)&~}E*W%CG`+bcyi*||WmP-9O`WmknRt|hHrRlRZ*u1%~@ zJ+DBfF81DMniRJSYFvP`taqLch7 zc=*gO^9ERJ`2Zpt=O4x#z%E@KW<#@bU@@Z$&v|WO4lpR&-0xAN_L|w^L_d@q*r{ zOnPl~xeApfRU#_)zS&u;tZj$Or=oU;?8`D~#hXk=DjI}({ROXytgNc6E8o1Od9R{Q zdic<@vJNQ8`=!6DV5uXyd-u+5(D0@L+1!#FotV|~a2gRL2i(1LM}3pD^PW7qvr-MIq&c{)!8VvNmWw2GADIZdB)Nj^@4(NUU+cBKgw>B@r4A(?F^pxb;3&7Wpq8XHx{?Yj4sev1bHfBPEueMC z5UG&~XC|m9$s0>dI8$$9BNN-8i6uMhYF16lh{d&0H+OGuFAp~_e;+#oeaqlv>~F%X zKxRm4Y%n#cof6|~XKJAMXDa4H78m4YB=dL~6|(5qG|olk8)Tx!PK&k3L24U0!}7AY zY)LYoB>;H<8bwjpcw2w+!dBj+u@GZ)(%#f(GPL+ceB?@lU?29?C0hk78sEn znv@uv`%~v%KR3ik2M-+P?&9PLOG6mKbt4KgM`AYshT3S9*l{Vjug{t?{;jP&$!ckz6cj(oc5akaEB6#qbp{cN7Vn7Dk|eDoZPD_>^fTByiXD6ol%^BEJH zyP4QpuIwWtd6JP0Y9_Y4#6%#mq;xu%xK?E1-o|scFK}-wF9^q^dyjyL`-zF|jENUz zf6IRA#l)@bwk1^L?wz$NCbnPXFFgSh`EuiOh%h9b6|bl5n%P*uhF`p-^hs|f?tx(( zOx)khwWyd_ymkc?GQJa`}>(&o9rI(r+6Ay0a!^FfHtJLzbq?VX?@bF&v9u>76 z+qJiC-o8U7`>Gp?T@42Hi?SILv20CDY-LQWe^%Dcs%te92dbF}=ZgFWS)CQIs7r1u z?r?VptBLsScc`)XFLY34i=%E$VDKaUx;3%!qwByT?BxHt{=wC^&$b@gvqe_4Y~E{= z$K@kXMnKvw_CG)oZo-h>R3wE#4M}#o(ukxZmV~iSLs)bqiGwFMh3rzeZZ{Qqhv&mX zVN_9*(I+A~i^v!rqb4I<;VFobMP>s&A*Jf#3L5Pm!Zc0?3K$x#yU~cGFl1?C0}(?` zsE2q|-FTXFNjfyO&C1CeH$!)EVd1Ro2ycqSKcY*Cwcw{m8?uAC27shRJ z6&k4pDFBUKa02o7xckbVG#)%e15$ypw;GQfz$3@*>?pBc(|H@ONN8{fee@#`3An=G_Be3kErMB&!ntV z%g4sqKg{_975CG5ijDnOE?=>JHR@BvMtK9juWLcqLTUB(&I(Wog;)w^*J3wMoMHtB9naK@P<}-uBTv3V>QO!F-rr41;HybR%6Hmtwh0%|1*j3WX_wTmxxi@o;psni@jG=6 zR`j7|{PdOGwA`Vhj#jB03P!=srdy^R5b&JRES@WUOdvz0Uir=d4Y#9u~)Y{OH zpYi`T`t;)uufBbz<-pEO8w!_Tw1CE6E|=2}GBTgBasWl_(&R?m<)xHC3Gx)A39vK{ zB34F4ga-O}xHwRWi03%8BkX*A`jTyU&LcX4O>n6v*$5VzE0yB5|Kp8fAuBh^Sg>4G=98yPXSU&9&l($^2{Lg=usQ0 zY>|{as_Y(8(#c4z8#izE6x$zOeaGvk7MpmJL4Y3))6j6jCDs!$%0aIZLvdSNQdZh1t$8a2HgObaRBE7UDVPdogG`6v zJriSN6PzaF4ZVgK4>20%lC-k^(2l~%X)z(*PBs=+j_$6uMg}G}PSz$S4pFITB-$~N zgP5en8YH2O3}B2zc&-QuIXj!fyiY$bJ0lC2jIc^X z)Nd~GeRH(vj(ZBFVVF{^2{JfhLe-4)@pi+#4fJC`?x_ZZmk;b>P_2I!6ULF zL(6~up<#$ge=irA8m;EwaMTSMIVsUz7A7Od=M+qyJf$El zF(SYlBcT7GChIy`iT%rLV&tDtlWIn8{-2CoTZ9#EDy~~dNHRw5-pX|gNn#{NLh^u` zk&R$vWo3oz1x8K+BTL(>m0;w7Qz}LtK2fuWF|wH$*};^g$Vg$mrmO;qK8->X5`F#= zlF!+|Mj}IvO@Tf|eR`5AOo}yjHzv7OrYAwkD(Xjm+Htt!NBL#>HIb6Fq$lfk^-!{m zD0vo?6e^@DN?syL*1fDJD|V?Vd8z%Dm;yQAy_#*?N*dOjW0?Ht48!E%s%}imql{yx z(tQTz2P)ZI$8sO{p5D<_+l4|~y0w;*ebXD0<-jEFlHwt*lWp44NSLgCR@TNa`KJn# z10_HH_yfvpRM}Km-|9kjsJN|h=k5=RA9e20Z{c@9PEA@MR$})?3!8~we69h55dR6w z_rZ|c@%qRA`t-AZV**Z~Jb$XGe*4DamFP)MEXb$a9@N`(5Qi2K4WKGPN*Zxv9fNid zIdlPqL`edV?%_aqD6tLU?e5};lMK9r0X!`*wusIa{6w`j@9+#yd4Li&6$eLG47ang zQ*cWF5f(2Dw`18^fh5$`YEem9*#h3&DG@OpOJ{j#dC>?QS8>qbN(Vdha*>k8A}+8{ zmo1{Qd`ro!^nh2OGPehn3l>6Ds!@6RA5e*)asEDCZsZ=~ve-kiR7xKG{OCDjD zD7r;fc0pCr`0O88*#uU~)-IXz`cxK$#v>SndXpM#IkA79C@n2`vwa30*l4JQdv@XW z&5I{xjEV^KbhJeW(8bx#MBmWD$=TY}GBhbI9;BolZAF@pF)#&T87BG^dj?KEdx?=k zt~Tb@W3geC3kc$yfkSbvhk&BY*paE>!&52UI9r*eNjkC08W`r{5)kM+ zJkZbG1*?(pj5$i3ywkm1?cALbTs;tCfY?$7&8XS5$Ojnr*S4f*^^I zn|rCq($eu^VM*m8ArHNIEv8};)7g!?q| zjFB?6ki?w1_Hb*rkfhsTG}MNWq>39|$XRn?0-}ohPYB5i)P+2NE@Ur44j>)5yB4G8 zd!KZ)cHEGkmwzhqv7s4!+_|}jkL%tAAK$NmioADp8O!rIeF1!IKA4iqRt|eqWMk=p zGb$DNcKe++LDZ4kv`QLk-n(`8ru3upzwZ)u_B*_Z(UHeWwmiyYPfg1kX5p*I~H_IB2ZY`kCkmx_)3CHLg&TE1B8Df)3#38n{r>StLEHI+XIP#fiCWQMk8xJxoI4cd@Z0CVO0Vu?Y zH5{?*w3FJ}a1e_E!iWz7Qr(Kq@w#6G5m|ce0|Ymh0x=pU8bYFMEn=y8p3tMdb_TBHE{sQ*)56DAv^x z2M_gdP`vV`0hkzcw;tJU4Z56vZ4k=(qHw?1d~6j_xVHN0J)rP($5-;x@~=b`))NZ% zRP~^+s5c4^(Ktp#VblC>6pDG_n#W7`sZn^L{Vq_*BEtn@;pWR=p~m$KyZ;~xJFHuXT`mKDiO&;K$4kUi>hiIou(Ef%;em^bUr~MB*E}A?%$T5efr6@ zcQ2l8J-EB3ylDA+j915E{*ptNPYN)!<_iX3AOjjw>xiBJ0xlK8=z}mHfy!y@*&tdA z?QlmrpdfMNVDCXVE)0-ZK6G@XOSB!ZkJC7tmScRQQeI%;D3OK9logAz8f7z!tN;t+ z84D#zT(TSLW~dJ+#LUd}q){WnB5)22CkMvl=cGml`S|z;hebqVDI4jC-R#=z~)fr+4OOJ^u+Knch zv0x&Y(kR&4D`WDMthlI%h!G*!*2JQtql=4^ot>jsfV-u>Q$%N)7WofwfRaz`mpn3X zIK-h`U!m6tdHBMNI*aaT=Ak*6sl*jv%v&=0rKFA=mF(}tr)Xo9I}-=j(lt<5ccz%) zt4Bd@F~LEhPOkobezyKTZisnuLq93tvx*Uq(s!;92kymxfPZo=WkH``kDUxMM0 z(mfYdy6}Aa4{aQ68G?lSs?HJ#ue~jju(3A@O(N;8j94|7lrs_@YG~Z2CSlDsh3q>u z2`@nwjud5K^~No-O*K1Dbk+%%+sd9X6#lIehTSOaWC&EMFi1lI(uH?!Q^Xo!5^>gW zKxzPn(r=IiDgE*b?sMTY;Zu6!&{z~cxB3hyq}JlD&1Gwmrhox8dGg5aI1ZK*u0Wqq zNV92p!ci|HUzHsmWS&QI@I>J#H#6|C`>-0ANb^XhfFm4l_!&kX3C6BC&*kXh;N;}$ z7nK4}2MI$}UlG|9i6jgGLuS_@iw^B#b8$N8AfkncH)XObx{X;m`FY6GMlZ?V2iKb7 zlhff3NsA5gz^6rg8B!o)5>hg92Tfj3w0_Bik$yPT?8W&=Vc+q00}JERM>FRRlZEr= z&m&p5tVCpCZ^xs^!Y6QnlPnZjC}58U3)m02N54IK!lYqe7IuM!nz!JZVj%qD-=FjX zVR;b@JkzI$cJQ$rq_(ao4M%5+B;?Jc6xYL~p&cb1b%BALt<(-pMZs3E(Fgq?15M4X z?WqId2;n$@H5hH|tSwBmv4{iPByT2|ViJRCj;X?IsI?~oF-Kr;Jq&GMSSGD3k(I`~ z8oK+2_}C1#4oO2KIXsA9p#sMvby9H+))6xo{VoFuXxOFO^&$CV6|n=8Zu#zKE11iHQ!rXne9Xg}qz~u?9#ncX0Lh^>c&;2L@G77tWP; zlQ^e4ySsV#1zWo~`2++;hD4=|h>8pf4e_vcboRm`HJtouGiGmEK664IhSCvMCa_@n zxMQ2&&DYm6#9b5lp%k*793MU+G$aJUcCQ+^yo|+Xb00$^4ybEdxqQiLT;N(sSZrcg zR4$M&l&-w;g4$8v@Go-68mCt$40V#zl6oyu&@Q?A{LK+ zaY1t%kf>D2!!Aa|bF$}F7?>9Co7!fz%z)ZJ5JU~Regoz7?_>R0> zOzP33nTxL4;>a#1Kq4w35&s7euL6jdI0_%6mRk6%P0fBPA5C_(#B_(7Xkcnd0pypG&$4YU&Z z8!UC9ACQQ>?60}6BtRnfZ~ij@FciKR_BnX?-o-P`2X<{LW%<=eF(psQn6aJX`iV0Z zEYEUqq|vIGiRxAYjgM(P2ATKBccd<%FkGL^InFqyO+Vpj>qPgr$eyQWp_?B95OQ8( zVFpTHjG$p%q?}u}f=$9OL4hHQ2L{h5lGC&D;UXH7pBmxm>J^9tZT!jPxDh_ic6LrM z61%#(`-DWrrH1ECTd;Wc*w_GAb)X9&4E_A5B_A1|p7#nAZeg-ewONQABf4=x)99xv z6n4=%3}j*ZLz+n|AN~I5?^mF(6VqrtLZP^p#87DPHu5vkGVDfS0f%*V1FR{lNSF~9 zMw*Z}(?G+Jx9ShmHw-$|GwedYP=SF9hs7AoR;;l&ILveyw(jV*ZE#Q^PGg5s3>l1x z5KVTvmcxjFX2XUthj^!1zhTxc&`f^3kF_^$_SqxG3=VPY;Yi=~3JY}7HxEc3L-%EA zk)C5LOo-0>0Z8=hd5bV8RFk(pkr$2 z=;{@UTL^G^dwTcYnjXb%oAs}F8L3Szi2c07ieveU6`*QWRZIuV^pm%tQ-~A_` zct{+rsG5h7k6?%R6^P;AHbRzR^+c0)Z|xdbRyMXI4#v1n7xrZWV^ z<85V6p%d?yK6x36N|eoH(h+{Zxn=~j3U{QpZz)w^qzS+xRm;w>FS1Q* z^3}kn6M>)}Ur#rpAgu`_st3goVUcrEP#!ofTMMX`ZIBq_ACuZG5LNDO2t-U!=u`5E z@Y<`5FD+n0+&Ra}%odA~siAF*pa7G$KXO!oNZ zWA7Yfv@ypHpt(7b(Yl+AyuA|gkh784Dw*?}11b9s zVFB7+2!m>3k_Xt1%x5GNOJPZv6N;o*`xZ~fAl_%6hu2QNE)uYlk{FIQI&BIPMqWxc)VQV>5#zx1eJojuduP=v9(fRMBzO zN=C=sovfqCAJwQi(MKyXIPPO`R90GojciX)R@8@%#TlUER*{Y^-E?dsIx3(Qe=B=a z)-Gzr^-L?Sq4jD8$0ERSr@EQAzZV>@sIP2ki&+$dRxVOI8B3W~)RdL?X5;=>u<^r= zEAj^UBaw}75gTjfV+wPC-Dy?T&!Su;HfntP@jHC0`~@~5^j5R6M0S~P=^{ApJ@sb$ z{a$d~t%BnpyZXJrM!FlLnmcd6by;HL?!#bX8;-L|w``NkZmQXcUZTO~9yV^T1{>=! zd9FE1a3sa3hNDEnqn#+f!y#yf*r-JJOT2A@nF@D9`uz>$?_!fsH?(Qj z`WvM9NWc1$r^H8`of-DUXCHs?&YQ;$?cIje>P0y3Hf{_w0d*1;Z>2wTTOyKEa0sESl#Yk{GHgqnMc3y=nPgA+!~$^uOSBcI=24MyH<5T+#L-o|9b z&i)w|sg-s>BEzBpw-W*&opG+&H!L=N?2NffR;*aQbjgyX%a$!!IB(YL({vUd6dV-|uiN@o8aIe4|q{V`F)IkBp3Q^$TzX6N9ka>E(w@)_Bc=Z1nK7F~d=7 zR|J(0(i$|l{{UT`{#rU3l78lha^u}~5i;-SH6lJaE&}O~9=wyKqrHV+2)@;v5z6L@ z3)jKACSkt8IFW<=+yLHB@c&0F9zR7`Y@hRR_R-n5=R9U(7NHqM^tL_7bA)PanGZ1T zYylWg9uUFUtfcknY^>WuvJqt5v`$6F6>EFz#?n-f zaa(6~=O*cv9x^gxw~|%SA{mAC1J*5?HGkQf^(90`gG(i4>w1&1L4HJf@o3vc>7}bm zHg47-Lk`BxYgP=v4)p@jxA@lv35FL!nU<_#97W8=Y|)*|V~k2@~Pcgufc zY}7b*^|%tX^h^N_%kW7%b{MM29iRmEr9 ze*zqZ3qm>5jytw6JaW*E{q|RO*V7$Q#&kcXFC7o=Y*f)v5aIYv4VGUn9FsTbN2zpU zRpmw%8#QX`irdScFgQL{DM!E&Fa#9g1L1GCb;A*&kp~<(n7;YjIzSnZVnVA z&0DC$h~cx4tcl?>8c2F%xS+TmI-KC-hm)AMWDq9-KHAFQGX`LS$uRE7#}7ufks&^=&Yu1u;rb(@V-sQ{1L%2(99$pYSCev9FH*9A@Nd3jr0l#UsDdU` zEkodQ68bA4|*C zG;u+G4S`Zu4N7w;NDB+zQj39-XZz`$jFu!K1tubaH&4HisN{mz7OjzOuHChBJEHEO zQDmh>tClaCGab&z{$n%ZLOlRW-c-wYC}`Pf#=+I7No$A-BVnkyiMb6N0?t1EUY4e= zu?1suMNHC56Q4Q&p&tpMF6M@M2Am;pAgDOW>;Kt@llr9b$tVgxE4dys6bZVCNH9)L zLaSqV5QZ(ta!SigOK|cH^b5qD!Jv`JXgl&r7FdK12@iMm_r|Y#xqJKjd3$=XFOrA5 zb+9{Tc3${ZJ0l~U7u4$4PihJ`I+k}3rwnHUHBClFhKG#s$2XeYFvB4MK8QbeuyN)+ zj64Ga_4?tZGB74O*w5DoXUu(H>F{Pc^7vcgT)HpKn*dEk3nxPJbo)a+3!;Tg{1iK`Zs5Rsy$@PQLIzvRF2r1zmLVf#LN z3_CIvMN8)}+cynnkY+Q1G6&eChPJB_=%<0F8Rb-Ips3;!^kGjMWSJ=IKGm{=qH8Yvp8zULz!!B_1cUE%C@BfACGvKE32c)6hK`z=& zTG~Y2P01hMd<|`R?cK{JA~nfOKbNRkP=MuX8vT#eU@64LY&7G7?LdMiu!#j3qIFHIa`^z#N_2>kx4Z* z4H>y2Khxqvoy~{n|4)7@Fy6)=PuD_wIweJ!XrF+1&-fA1F_wODNyr+(moYsl1~X}N zgZ;hz!thl?8E%0uEKHv>n-md0eT6&Vf zE?%BaKJL_ScE$|~XYZgeNXbwi-p$@_n28yVX83tIS>v}oJc2w;2D?N=V@ea|kMTIQ zq5n~Bo2cC6Jz2G@>>#1(J*$q!>Qp#6Sz?q!X zW^E0rO|H_aYG(->W|zwr6%swys$#@T<*l$EIfT8d2>cCw2Bw5~^S((OW;V-FyJu3xtrxfK29V9%Ov&=5Zb zy!DrrSCU@cyUv`|4Z8=jRu!LWf7GUEQ%TM`qUZHXL{F{yGDuE-1YMs2J#l+R zP0xY5>R2%3z9ZXrC~KeL&b4&c_IBBA6+SPYMz`{E3RLIzEt|1ih?j;}V88B<^nK9Xa9=2%hvTmfiq71sdZ3p^{sgpeKI46Y!*iHPo}@ zaNo=Pt1mIc`S2?IJ%@I0E?GJMwaMsK5;n(;=O<{6A6GDjqbm!*CiZ1WaS}IaWkv&< zlaC)jR~ABWhQ`f>u3T%eF%IV>I0?>DC&xD65?a#{e&cST`4Tbtlp(6#7nO)~xM9@D zQ7Gq>vD_#j))|f;+C{^>I}Qg<t-*g%*oT(E@59{UhP9n9x9XTMNBzp*@-uimYqL!+!ua&f_hvNfsu@u(mOB> zh{z=G_W&>xkLJIwy?4dv;+q)Z?A%nkdhxuOGo}(U$HOSajWtx|>C!M8>x8JD&6O5X zE3Az0%+^D&l-Tk%ytS*19lKTI9vG80X2!xb63^w54kB&2nE{LakLsh!N3#nYJhh~XJ=$&p-ONK!sWGW6au){ zI4UMKHj291uq`A;$BZ0_2$RTw06*8@;P8-OKOg@f6x02YGJ%1VmrJ})Fh*3sY@myd z#c)?m9UVkR`uKRm@&uo(y**Ydt&w=?;AmrQZ)0xd|1mCKy#%EnhT*gE4OzvXr4H}U_qNoarS}c zv^^p;<&B*fb(7*eP5I(##mS(#r5l=cG8Hrz_J!uiu+T-jx~k=<(R)FYB~tKAbDoiP zLUZb_tyluhSqRNpCR0Om<5uy`A@QrWUIk6fOIOQP&>YBSJ4IN5n>DZBl2vRG`|k~W z*&uw5@`|c;CF=l9zD2LKc^{kcpjLm0n%{Jsly8zh7pZxGsM(y;L(Mhh15#15>TO2N zZ#r9%o3=2uY!42@QmGErxpN1jro2U~nV@;H{pS~<`Hlj4x-UR8Z{9jJGzV=Jp?RQb z`;Hx)NX~PSc=O?I%Hl|0w$aE^tM}z})(3$MkGaK+wX|6z*6nA73flS(-;p617uJC{-rH~HA zrVI>|iOE=#DVR8A(zu-X5y7F+38_hu047b^2Vkn}hI=h8uI{|2h6qgmAaeddGP7KY zS##&j>n$#;Brg@gQW#^(!pE~<3TLpS-lZkUOVCn@aW@BAVm$^{a95lmbaZm_jYt}eIBg`X zY{EuP7vh5AGil8X6Q780e4wp~q0v(O#am4qo06ejd(#KAz5=ULL$#f270X zt3!FA7Fdk5!Kldzp_PuvxkN;;9r~WY70HYo|`tP>4w6L)>vv71Zb#rlp8Oq1o%P%;<#?@UjAPUET14v)`dV9TcxA5;x zZPn5%+ZD_;-iMWqRGn9;SlPOm->6YpT@P5EDrB&%!CXhbzL7F~ROR{jCRFTbXv*2B zM+M6sh1pT4-C9$*krXChIcQ_`zDkjnW%K#f`n@D(R9NW3J&cw$J+y3P`!fQgyTB=!lt>Z>Vt9+xpLygO> zE}S`#xAHCei&BdiEBE)XQiiM_&2tAfZadNb3s6a}N$EbOE&kcd-!NLrt~B$)`Aqt+{u{l`HMCyJgaKCp)e%Os-L3a$_Yhc~)7^*Y(?3 zJ&ico1x{YY(5Fo$FA;#o^0qo}b)u#AoT(iSnYy&s0pB?Cb@B5p2`-jGY2qV}X`pYu zrgHpiB_==4pybEzUp&>cXH)5_g)?#Ty@0Nbpm-$BK%#-d2hhvpFb&s4sfFj)P#AhB z(iT)BOa_v)B##hL(Fv4PI`d$ps4KA~<`FnbO-QU1zCg$fN`BEH>mDod`B*Ma04BLu zJv1*<(B;ISJPwRZ<HLz;=9) zub!;Nn&w;}5~p0?HsuSXW5;01Gp0W-JQ5)-_+dJ1x?^c+ZQErp9q!P^HVD1Q2xMt( z=jiSm8kaL+#_R=4mLp`QXl>z&#dG0d&8G!VlJ@8wrf1}gF`o4L+yx8fO-KrHL+jEM z_hZ>yM>$kLZUv&wq(J2mD+7H4BQr}nF>7rz+|_QlFB$W(7D$(0u?UbUWc5pr4{{u4 zWXNN4n`Yn~W28j?_de}QL(xB5P>`907A7PqHDZM^M)|m?m7blAWzh5#Y(*vDTtX~A z(k(UtuXgb`*gaCMCqpAb!^6Y;{6hl+gF^xXg8~6HoM!O#Pba@qFlIr1o^B4#0XCkf zz_C8#PcM4T4p^(Sv4Q~#O#}m7!=Z+H`i9tj)HN7tXk=>d?CR;@>Z;)sg5%ph9!S#k z#Ycn%cz+tRE7(z3_m4P&_KMbxN7NKFp?xCFQXd` zO$5mr5t8*JDtGKvLsD{8bWaWz7Y$b~#3|V2g_`SFVuhk?kgTGzym0=Exw`>K4t#9r z5tN58{L#L6OyuM3j-zs!T+xeN4%L9_Ae+i z7b!mMMm=Vd>|hOpA@3w{=A6kpE>{83-O0r>2tdqAj2-@%gNDMaFw`s zd8m-6^m7axL0g0>BF+?v_=ZTt<7Y3vd;PO7(Uw#Zu>(`@9wI6q{DFAfXOI43T8#wHfTibXh z(^?W10kNLMV_mvmdTf9LkjM=Yx{=rk%jA;mj#<>S=r=rNO!7crUgIOu%O*xWG%IAH@r?ieg6 zur-BDANtDU-xNPG0i{87YIqdRp2Itfo%$r$jFMs^U~hnNbeQ3Qfk;FjsMU|xGS}|c zPYdIp{{6HxHMO<0bhNem_3y7UVBjFnS6*FE5mCux<4?0&X5XBnBH|__oavKnTvS+C z)Kr1E9VQz!ARC`Alrq)0dp`kj-U?=)OmC^{R*lb(NREomNwF!}QK-45xn={;B%}4l zO^2&hl5uXIsNB-P;ZUPo#lzy- z-aOpd*mXqX=-V_6KX#PP9O`3`j9Iv9zXpN18jOhIEPSwRbM^Yt88fH6zGB;{H(!Ot zODZh>(9tL_mGderz6aU(4_I6}m$2B@s=p#-aW@qy^GvgeQBnKUp~c&d{&=DtCpCIx zqvj`2 zuwP5?53>CFi%+jzezSFdZDrAtSyPevh;1@v$fKbRpVNtklNNea=`fKCst|Dl0Fg~> zn1!4+36-FsfTTykv9mV~W7D%ULBohxqG8-9>g`hj&DJn70b52x$U_dNy9D?n2ZD(3 zBC}KpKEo~(B*tDLlF-mwf>|&pV^oNbcVKu-G#Jw1EpLy4OId$oe9KAh)8__ zhi_hbuMZB}k?q)n!_Ef^jJ7);-g_B`7|*bj3F=euHwJv)-D@1$O+!?=uOVVW6@Dun zlgE#dfQY(zjD~h98saJfhT15dVI%Eem(Bz`E6~u!IWT$L8w(fAnfV%>mY#@HYVb2+ z@Q=pAC@l~o5sQGDNmxZT$sYgu{6%x8dVK9Z5u02!vcT_i7OS0TcO2nUXMATD)=joHm-wXQY&6CX^Y91MbSwMX%3ZJaca0hW`!1`yB`6>*XvG_W&@c+XsU%3Q1M+ zu$zOcQs(|M2k#wk|4q%o5|q!HpS-hI#lh00JsdPlpS7l&gF9-8gZyC$mN13d$F*A9 z4*-MDpb%9U%<7H7OI`H?>spu0UNMf<&s^D`OdodijA!ty{qL>kXeSCcwaGJn zU@D@~LqpbC8@gy3cWAKf22_HLNP`qpvA_G~i%;Iac)Drt=Hg|uDK8u;eb~7s!H6sh zqz~Xti|Cc6NQFwoG=_`UWz!hk>O#c~BBG^;o7e4Z1mi)ZD(pPG>p73hV9no*-L z0P?|6RCl?%;34!B%E8o2Bw489AW0V{3+o$?ztx9>awup3?yfklR{lgB6pfHw55Gl` zj1Zpt8uxz0)J1U@`w1j+6P^U8n8q0soL<;$HpcY zr{zzXHE-6mf{bW?XKQriEa}byERoz$3Enh~p$2&avmrxGOihf2nprtmVA&ekN|XtK zV-!$=KwwIwr;Q0AP&q`2CZa&gg!;VRbA2U1sP;krS5Wf2AmGh`Q+9PJlpL?@>}-4X z_iqnwe|h~>%b~s7H^X*RRlR9*&6X|OxAV1ww{NMb*}S>BvZAbP(`J5azb%_L@7S?( zC%;>|XSZaxVwbQ-s23W9{lX#cu+S*r@(I^09Q8QT)YRCBd3?imtocLR;;?MYo99Lh z9H8U8_k&Mcql{!9eEQxTUERTh2f4YtigNx0v=js6;6&Y?kyEe~Pohu})SCpOA4xy_WSAtLMyFyqaoZ zPKHCMh;VEga^#)jb#=YDx2;i$okr<}X6V0`y*TKK$+Q8ROpEDcY<~t0agu)qn6b!K zFB@GjY5E)Um#r%mxmVv)7awj>)x~>PP(ax}aF3V&LYHNTe1ns_>*8I7@AAj_ZuBji zt&)K2lV^zN!vI??0dZ47yR~8E-lO-9wg0!Rs|~MkHPSMy(P)19cKxod-A{LE?I@~| zbvF-<(`FWSqpxloi@iO3h_)?j|E|?Mu&3r^5BU~GgM8w>!i}4%FLu@sJh8egHJ_2M zm@oT-kx#B7pOyr>gtvbM_1bUr!$5_=_nd(b3xzknmwYdhPk>iX3BNd=&i%e8v-r2) zb2o;5_tj?~U3sf@|JKqK^IxZ^TU-O7o)GS~Q~G_j5)(*}53K6K^O0~B&nFB(eH;0MVcaAlEG#6hf+?A8yPc7FDZNc z^fz9gJ~2Nz+;g}!)@!tJJ`3$L1WM45d8js`b}(e-hJa~?`a?{t94u{p@q&R@6|yA~ z^mKAE6T@9Cjg5wI_;Un3+Mxb#AK*O|gr9|9`2Y0#_3y{e+S)t#_JMLGFYt;^j&abG zd-nIQ_iuguuMaNczUA@OmSzIi;X{Y`gT{vr9z-ft-QK+@iE6jQr*_}~KJGjyIoxqr zf)E+LRe6j%%e~3J&0QFN{yGAQ&YwAX(hVaQ2fOCGA11~XMOC~zW6IT<8P_&NpMEO< z*JGvOk^h5r9IJBg&u*Q4V-B(I?|B;Y*OA*Buv zH|wBRH(D{)Az-Y$jI4{qI`O_iG1a+;Rjljj`<*LF-M+rO<0v_r{RqF=om} z(0S$M8&?*NnLK&Mta*!9tt;tEyoSBIdWg6CTE{OPbs(MsHt-jShg(`8p5nM#>UHz3 zENRk9yu*bp?biAx@UFG}_qI+raj+<(;@$pTox7ibck8zH;$6z?IDMchdH1V$cR{+PS&j;LWiJ3v1Hj{N{|3ah^#UG^Nia74 zz6w?k~um>n- zX6|+{53AGnB@B83JWc%VUeLqsMrN?-hTf`0G&6n`^m39T{an>8Kq`7|F*8Pv7=s>f zZ|3ZmIA!_Dxntu-rHr09IWIXXDi-H#kf#Q5jcD}&m`i1*A-F3#Mk_vZ?BwbEH0{Yb zqx=zpZLNj&-Y_%HR0qHV^x#9}O)a4GKttGXj0}dDT02|Y2jpV!9Euv~Q)UU-{nJJT zInp&lB}!gGpH!dCLtdnxPJ7$4r;q>s>(5{L|7id6=;6a(e&GN_;XgxudGz4ng9mqS zeEr4epMLxiwoE_1#(yBZKjhu3moHs>`@;FR&!0Pc=JfI7$6Db}lblqZ8hG-=sZ%FT z;8%_vmmF6d<4(dje3CmQoaWE*=Mnb&KKFq$j<{XCbmjePYz{2@@yqYV?YLJ_D04}A zx50n3Px$H6?gq%rNYD633ZB{5n}W}o;?tO4cuYmX*{ceR)*pF+f?XAZmk|UDD_Mmb z+F2nzd{mTs&yRHV5qta^=>aD87y!4D*kb@JU#rgPrlsZe1i&L)bvubYw(fGeg4?07 zQ$;{UsQ?20T6SC}5CONY+E_Gq_97JlabZeDz{|x&hk6rmYa>qw49|mr8b^0C0MY?L zmbEwwOEWC9d&7n&%!+74W8&hK%cf48`r7RIi-W={K*qqgkH7owUNG>t zj@@9O9JcQNgMnp}Rhn;0V*U#ZTwjJG*4jUH7B3Q?ty?py`n+?%}qTFtlU(63Jg43wxN7- zh8lvuGtt-ig6Ja#YC!aHH=nU)6%kNzv*T9RZJu@YX&a_LL=3e7u_Ykt1Ppxe{VvO zUZmGR=!9NF2?-&jLK^8nr~%Ro>7De1gcQ;sg(RdWbO@k;%2=kTGwLWRMG@3dQCf0y z%lp3HKF@n^aud=2%v#?XQJ1<@;@n^MInO?OTMAaQF`z;5u?JB*n@!-}($$Cyu%NS+ z6-Jw_tv4I5S-u#T5bXPWr!FvY3y2N(ax~p!?TC1cjcZYYV`Jy&#N*38 zge;(Rk7;MUd86^h(VJ~ucJAK27mZIghV%6GC|d&CJ=Iw0n94)zg ze2xE?{PV+qd_;-w9|3#d9!fFZ{mVOVb8o%&_N|-1-h~U7_=~~?0aTM*;LZzY`1SHd&bSL|FH`r{O}Q*E&rH%M>u99e8AKnaql;OAwU|_OyI-ef)YUkCW=#kOg2#g|`OUyrV90-v;@lm=aDnnnyaT3zVr zmtKC8Q&OHo`i*9G!kn00UVeKI_ymN6MJ2>1z8ZYj)!_R@Rs`_1cmDP}@S*1=T1)(O zfv?!Y4&bXe#WH8{GOb&u245+Gud(AvPw=(XlysK9q+vHl13q*!87nvFnD39`)0lBQ zc|dKR2){BBezirpXP>5h1Ncen8T~4H(65>3mlTtdz7sLiwC+3dbLvf)WfZ;Wr@AA@ zW5<&o+??`0&ijBEzC>^_1o|1jvb$~i;5DWojAu4 za9(3HCH#>Hq?2f+#Sn^2fdE8;4yG5NPr?9531VZ=sEXi-*$Y;g+1hV4Gg=2|0f2~- z9i$CFim>lP&KL`&IcK55P4sNK_M;2}`X^bUzi!!TV=G%*t4)SW7A;$2ya^$uYgeGr z8sw8MT*NPysL^M^&_|BJ13rHK0muqFNGHz~4d)p8KK?}g_)F+Rc!nB%y2uMdy0#Jt zIU4qnA4dM??E5>|H%!gG6u7HdTMNH^ARY3dsgT%5fs_<`M(jg>UtjnI@!-+TzA4iu zPoA;D)+;O~Xg3VY2->waUB7mNnYF#MJKj#*u_q)0BqGRM9k*JVZ8RNiVe7KPbJsp^ z|9uWd^FdDZ6=2=RjeA{eCKyYv%rKIms{qzKe#$VqahW-LB?7mgA@Qw50V~X=m9r;~ z9o6}I-;pCm;1^o=@k4*?J^88xzEiN~RZ5jY_Tsmnet7)dw|Bqz6p

9b@15?|*)P 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�D2N=tI%j=0;~+w9zBYws`0NzN$A zi41XEyL9z>qs^Wr6@@z&7%exH>+uXmEnT*3rNJ^or2(UFicaB$ddt^t+T-FImL=*s zd-a<;UwrZ4w|h-t`wqDu*}B&?Ai&z#c&|7&JEtfy0EM2rJ^Z}v%=a8R;<;~=;hJs# z6*ioMr_IB`Y-+14@vU5~5j zDnHHxT{VwPe4|#W8_`*_8u$#U|b$UfqG$bTwXUnl*T3FqFU{`$HQd7oo!=P-<|&@lE3=|^hD)`GF0v{%c)*b(_rLlJw3 z_G%**ot<4?LL1lG8ha>WvnvXp4Eoo5!{Fl2;PLJ~1z2z+~B5k=3!qpRh7axCeF`EK5C_1Br11z};i8dn@IyC8~FMSo) z5LSiX6xq-HWHX;33mm^lUjeN2{%=sPa8Le3y-tUE?Rr_gx_h`Q@y|&p>pUP~>03B| z(PGsS7MN8nouZGsQcIQ_&VFre(kH*(`S_han5KU;jBIRz?S70o&a_YN=y0QA*ZP^LodaRW^iPM#&n#$5bQA)J`-c?gZzCL5lyoE+<1V%=i9iwuy zf_JYqG+eWNkBhgzFf{y#hw~wy0K7AK9kf`raHjN4#dOs)1uoSp-sneDEVosmsj}7sh${y4r3x-|HD11%EUz)z3RIBh3AvXJT1(X=zzuQhL+|;b^b-9AUmJpFv*V;y#d*HwvAv(mkGTDXTLXNJ3aN5%Wv zY%n%7GN52pLaxrs7MNVUXetoOSXqIIK=_1Zp9%$*@q#Dp6QRJgPszSQ#LMR8Nc>p!$hkqM6CV7q6W>ducQ?rFvbhn(A|luqelw zw}k4N?kAD!rj0wZi)eB{x1|0Umu@;0u7&mAp_>0D9@||f$_y5g)(9T3ehXM{rC6U> z_>yjxQmRjE2`DPcPtVO2p=>K7o!GaeTZQfTm6OaZ9Zb*byj%OCVLsfG`-RIJe)kLoY(ZB4d;fVf{ zXm+JVZ)N-7Ht@W*(0mY-8~FO$0OHG`P;ckMHCU zbnjEL_uqR4hBJ5jVMoaE7g*GbkPQwQ*v^u)CS^NA&zG>@@xMpT5YOziwr&Jr`yCky zqUPWJ8po(K0vZou=erw463N{lNP;&ftYXVN1;k)sCqamX_AGcKaQ%>F-94 z@cR4v`T8(^j4#hm<;(go-b#EU-?Lt<_ZlB>FE1b8BO&Ov&CEe4v9vHxlo%Qmk(e6n zamd}t&M_oEJ3gi;KXm6?CR_2AX1Uv8^P$5;L*p$h4+ig%{buXdz~NoD$#S0yWxTiV zk-%WQN{1kxNf_VQK}7UNpM3VkP5gtYzEKVXc_r-K{-0@-Uq@G3MO#lNIH)~=@! z%C{a>dlYCUCHpV#?)`4l-EqxW&G-d#=U{(sKKce0FOe-}_1LA;^p^s4MoXqlvTOSF zkJ}%@r)X~06>L3(Ivwr6`UbTmahR5Xb{ z5yP*#T#}cO5b9yJXyT;lv*s^dvuX3nKe0>c$1*85$({Dh%ler}GgJ^@VN zXkXWzYnNcNSUE$ENP%ja5;ny!xc~IdcTc|m?6Z%`(^7Miyj(&&Xez9K>%$=Bk3{2=#F4&nZwnwQa)?AqrL^Gv}U4fQ2M zsP7Ew=V++k)D7yRr}R`rb+t+(=6@FvF+a936+Oz4q$Gj|ujD4Ee+=iln9e_;{>C-&Xfm>0h+Sf2*@bR{IoM{w4Cegr(!-aR~Vv2FRa5$lp)m4(V6|A#y$} zc2LguYmr~k#5PWj-Bnh>Eo9f{6qOunXaxGDBJ$axE_z3WGMJT;X-yWg@nn~rrGlE* z2LCA15`~RCavGTEd0JU6eK3-6|K5EmY-i;IBwUedRUjClKPk>_+d|MV{_< zA`CHx<{Ea{*&jq$!r8^mgE`E4l5e9R@`3rozk8}YSkKicSnxdT8yuC8nk6ofAdN51 ziVqG5i%$;3+LE2s{?Ou__^86-n7t;OOt+iuu-WUl+0Dxj>kX9n*-0TT)*A(c_?y+l zC$7oAAifgD$*Zz{DDm0HykDOFs=$L@|DO<_1o8XT>qF#0j}&c8d*|Zt#D7gq{Oudy zoiKAo5#ldg1U=8wQ!SmTr?0mZ``L>ZFVdegVP434%Kq=JT{(piS(6HhhcOWL$2&T^ zdwQ9ZBTw|6IC=6EbMm#mv**vBJ984B0^QK|Ot0#MX>Skg6r%8tBTq)Kk5EJz-WFp+ z4!kvI%G8+)4L6vXty!_fC8<~(vQw}e^4`(i%P%N2#M|Ydt4|;kG|Jy&??%J9GZp`u z`Ayfa|M24nUv!I;(vt$cf-|!-5~CuMGmBs>&s0Il@CnGRmt; zGJ?F5DoY9yA_E-UVzaU`6T|b4*OcW-a^mM1EHc2W9(l#n8>KgAR*p&+0zzjrMU0jolF*b0ngs1&@SD;Zf;+ChJ@yf`!3J z*>R!k<}Y8rQh(8s0g=zLbNU2#iOOc5JZ0Ge0s910CltO&ep<*As@TbJt%)}01i4TM zwXS4mnBd1UK`EOpWSxb(*z9c_{$(;EGrP#8FUCt9i0S0Ewtf+pO4r}j8SewllN1IHanTvHOYjD0uY%aWOXD3#B)p{Z3F_H9y5FEg zQ2908B7L0%h~GWeS&Jo7a#D?P;2mTSG6&wko|N5Qw8Pubx((6 zYVQW24N#s$gyoNzVRXIj4=6E_4u$*&e+v0&6!P{q+twTFEx>jt-U5j~&Mam07y^0d zdi^C!a35vL*fo+LS=sl0dFNzDTXVCjX)F-m-q~~FRNq3K9DVBKi4!o$JDK)vswI8KG#H@?61NpB^ZEnWBe zrsiiAm*$DmQnF$aqI`X##f3Sw9Vff1^NR9gj(GaV=hc?x=A_4ES5&1(_&e?kfTvkl zR@K~6T9jWHVYR~8$iPsr0vCvl43_UP&|j>lzj)c=WyS_e4Gi?xn(c8GW~3b1wkGBD z=}d8V1<$4 zGA+uF)gbm^gi0`$Lp6S?Kq=57JO^d=qTr!Pql(o5nHjKqGBAEe@WkYfNgwy06AG0q z|Aq%6mHoBm5Kc1q?eL9}8;2gSG)c(Mt&6JN_*3fai=HloR0jv$+vZ`FQ?>kt3pjuWB#5F8zc8UgzD;JKx^sch*R2 zpVf>g7$m%68)G`vF(h?>@Ws@cZ>lpK&&hX0J9NBrY@Yu%@}2*f9YD=-o5z)wy($ zjnta3j#Cdh(4ubu9zi`)t%N%Scn^J@yoaLf&B|i?HdE8BTUA?>n{~ICnr@Sss_+Be zW@Zz+dCiv1n>KE>uyYs2W5=VAyn^OsCkXw5W0Q{TL+h(xXGn=CI;@}~!_CxW<5n~4 zJr1s$JqJ*qmzNdix8H0%ES&!r)boG%@!0_B6`V`2di4L3^XZ9^fm-&>H1yfIIf3)* zRxHImlGy{Cr%AK{(l6E5n>X>bojw0xpMLxC+b7#wn_E=P6DjCV_MJI@;o^n!XZubw zrzV~}(c63a%()A1zkLBearzWv?HzuL0?r?BuYz-a9lrU z`fR;b+ik4Z8E90>aU0TV}snBGv& z-YLKF{N;B)I9Z;SE`)h!@<^()3RS!gvUK zD0Zspg+$Xo6%@#bkbnA=l{Lca(GZ``3tF1~s^Hpxr0L(45aJUbr$6Wl{QH-PKei%) z6ZJ{Jzs|`HPSqP=Tr=0BsF{xvRpO?Fmta@d@&2AQ8f z9P`IErTFA$C+1@@UX{)k6X*Up*NV>O>VDYSJe;KG8uhNpPRMS`Kajr%;*TV6u_t>K zCnm&q4T$>c%6F9~bb8guKUPkW|KhWj(L$lmRQ*<|Tai{%^SegYlf+73P&lBUf%G7O zz6#JkL*4uHZ_Aq|Hd|;^eNj%4q@qXFh%>R06LJhmL!M-hge7GQBcczwpc*|Po#=WE z_H}pX!UsOQcZTbScW z-;Nz-TTIri6|7mc(s;!R<#KifyRv^3yHaJ$tl%wI7_C`uWVFn9orP0id=@S}!>cdO z7bOJw3S(1(_HTb{`Kq1a6}d4X1=XU%+f6o_TG-e-du}FCjVL_d;(kG44%z}NHW1Qp zvE1j17hn1ut9EXV_;X(Usq=$geLq^OG|tUSq$iDfiih|;eDwImFG^^7QvUMaX?pq~ zo1O&Ld$@8|z1)qw#%fT{%pR*o{Zho~^cnn7pJ;k`H%4<`pLFP|l>NWk*O15t=@GbY zX*=H0)pPRn8Rp!ZXHK1fIYTsi+p*4`lV>RWVcaukbkCeUcaAyBqK@g*sgtVS?F9CS z7dF+`)s#zeGcyvr%ofg?Z-|pJwkF0V2U81DeRgczWNz=~<>N(J?*wHZfR)K0e>WQw z!}+rTdy>f}jy*XzDt#IDc?~Ddob4%(6D14xZ{3q#Q(9b7EXvA8)XmM!KPEjVucEE3 zOq3@{KH}i!vM6<$6rMp$}nGP zEG)o2RZ3oVg#EUSYXxtuS-v+c*vD4_lzdXI^aZ8W(CSNKT-xrs9(>L<(qH&v9yS^3b;S= z4$<{rGGDy@*H8ZE%E^|Btf(WNuIO3k;Z_EFa0;pavcrxIb`~M*Ioc~NSo5)_5+JIhAl8EnkmizbIhQWA_HVIsY~68}Kgs670tz-l>NDJZAQI3VRqh z_^mJi?PpNh8vyvmb0^LSzAk_9^UZ4)PaJP)R<pQ!8h&kWed8`H3hDn;d_GnXE zM{gehf9A|tI6M4v=a~!4c^mw&?=;+;lf8gF0+3{3qOugXfm4HQ_2w^Lfg4J@x2!U8 z%qUDbY`)2KCvxAuc$^Ij_Cz+HvR-)P@ZPP)i{{SaSkEAgLs+kzEE^KWaq2j8qP;FR zEw(Z{#m#j6{_rCFU2>7MIpXOEH!dW;82!{mIeBGC9{U|#oZO@F0iG5c6QAU{+kC^? z%{H!C^^J8E#bqTvmdgdJ<{23;$BC!K2B!A*dyEZ?4fH{JL;YpTArHPNKYLD${gKAD zzLwgGM!%?(#1nTP-@ftPjSgYd@`VTUYL6BrWfTV@GixS*rq~}DVR$H)-LX~g#rBLpVdMA@rZkIw}P?CXM_es%*+d0$f8=MUh%PD|dOYPX*rBo>Nt+s(y#QFDS40CtUYwBD_5#lO7up92gX#MSN8B z6{!{e6%fC28x%g;t%?itlZqroeM&?zsKWmZ#Gg5Mk2^3rEoldLj~malBGLJ5l@{?; zu$S3~9P!B!SJh8C_wL`9t9=|4sX^RJadVp7{=sJfJxoTknJmp-ve<+n0$)Y#9CF$l zZEG~3BSrWU53|gd>=zS0|K!@`ldYvlTzVdIabaD?peYEsOPoex>{#U5fqce#3Mu-) zB@xu8ZQZy|uyXk_{UwW(3sm!Uu_}X*A%mT4W}(i4h4?83A@8vZ^;TK9MP^`8h$&r! z%we$TIrrL6JeiRlUw^UJGQ{U3wb>ehi9~3@wo_9fck-5O0vx3C~ zp-+r_csk^gDl8q`N(!?#UZl5bz1eQNZL3Y3#Kp-T+c$0BeF$kOAOB!Veix4X0p179 zS1*2<{3>+QYR530-oAXix)9#M@z#PP7F%`(z*o!2$%qc}bG6@Pd%!=wuBxO^l%A0l z>F(&_yl3aZa3N~nqr!vsSZrCla*e4|aYbciabAAhfo;Zu)$uyFJE+ zIFq7}<8}H*tJiPd<`;J);XU?hdP%PPexK}e^O(xAx^o}i`s}CgKP~ZH=9^Vhm7fuw z9BO6h6TH`C<=O*D`RPIzI~&1*rN*mPtX!e@1^W+H=Z@fE)o|%YPE!*HMIQ7H92AbU zzlSQ-nmU#vZF(djZ9PZYK8~~%!;-dVkhEvpWm=k=k~RmV)x}`i%H+?WqzxNNT5D+P zGASfAzob)f{?-NE(>?928qoF;(26qC;%KIwMB4v7XvZ`J_ZAdq;kgF8>uISO1hj=X zsV@0Yo-6ObF>$#R{S_V1*8iHcS7aZ_&&vNQyC-9>^E(J=YqUU{3efUDlu*(pbEN%> zk~V92(l$##+E1i^)sXfsA#Hoj^V;V%Bg%%7cIsYoEQO21WG1Oedsai*(z1$wKv~Zw zoJ}O072=GHT3Ms;B&X=iyYDLA;h!g%tsu7vXm?V6Z6PqLXk-U5OS0`KT0o!%7sX>U zQ^`ef`a(*CwFa}CkwQSrz%%a$O#4X+vLD56%>Dj*e}KCEh`+peFq%dm34ZY~N>+?W zx?P*Fq*b^72OUJ*Q6c_~3^t1H*EersCv(CVpMUz{r4vn(v0Rf|S1S+Q}CUqY@# zRkE0Tz(7`e1to}6f?RfPG})KXRF)hjt}Y7QZDDPXR9;ZfW?@M9|3}$-fJJq0-`@j@ z#w2QrH&GM2bZj7^prR;tv0$MKO7Fe50cMzi0fyeCNk{A;px9#)b4@hHuBcI?X~qh} z%$)PC?>RFRHTV7fpBrKxg4|@HpIK+^wbu>~k4_Nca7cP8obrvPhWc}Hy1>$oL~2Ox z#mg5_M<37kp|$6R{FWM$`xu8lhe=LjtDk@sBjv}vB;^Rdr00nQSRKYxQ9f2AU;h8F zigiq8CdyznAvzeh@)Z6FW#0>|S~FI;606KYCXv)yat&JZKN{-r52nwUG=5gf9qC{9 zuYKRK7yb!VrCABC?qQTP?#rd6poTInJuA1cjAUCXtLqx~9XJ4G-O{@GXj@x*dt2Ml zqb)}c6I~709P!6Ge3#uN1vweQq{JYrdFq;T<}O~fcJWLjtCWl=+eOC9Htldh5Y@vs z0B$+j5Xfv4cDdC`L-mP$s#=B`CF(QPPd~$@r|wTUpGZbi1A0NM+7IR-%Hr=;eyA+Q zeOExdfEO8yZV;a+56d;{93pdY#VkEJ&^;*H&vwhk^;@hQx4Xwgc<(~J)?yvadDfwY zB3?#%l((Cw%@PCsDH=Ketd{Qd?b{7hHFRfETB|g4u<2xIZtckv2}(1QQ^Q@2CePF} zw8}bGS5vfq&*NWyd3-KtwXdi+J0U(K$j;Pki)T#W<^}7cQh9+cmh0B*O`oni8#f8H zf1>}PhxDA=9GLfh$lg^L7wrDa5Rg0|cTpQTm(gi-&4%A`r_FToF*9^D=_vs0_M_gY_nV((N))WQ7AlF!z$U-e(wTGR+&FJ*>hU5 zUvin{>z+nwGga~-iJve!Huh9MUZa6m>Iwtb==Z|4q1cgM*Y#cZk1SjhcmMalfNKp4 z*WAHyRkiSlrUY~{O>Am`0P*!AvSbyBLDoYoS!*TyXN-U)WQ~qcEM|sTDkqafz*2nzmO`aA%C%ux&=@r;s48dl zD|KHAgueLo1D2}5D!WvKWuZQ>60d?tS3K0ir|!M0LeA+?3by_SY{kYqnMVHj-RZXG zvW&Pu*By3h%+X;izKLrbtTThj50SfT{wR(4#q)_fUvUZ9Cew7T$9p} zs?*cST_z0;b*(u|w)w<~ve2KIftvv-{0NU7?hz?T!7f{un{J6L%ZUpR6lMl(UcbrK z1@UL!g}#1)!QnB9s1`vUpC9eHb(xWYAqWfcip3;CSZ`8s=Ht;v*w*8HVe%e`SJ^Ez z{gS-NU9z!?SBKp5e8|E0wi}S8(5dw1spN@-d7Jt_p|uUWLU1dR$*o_4R%=_bj%qJ; z_`=?9`=-?xLk?o=ba>NJ4O)G%76x#7lP4PGJ)-`4aQ*xCCKwawpQx%TD}_IS(hpLl zDNM^QC@!n2Y21GpVg{R;u%{0|v9`3T9BrpM=ytkoRx1H3<5=w73)M;nk%idGY#iMvuMyr}o~~GW*BS^`>T?=% z$nH;6J{c_=MGxZYrk0u{Z(ko5@3g%~FjdSF3;B`JvCcMO;w1M?+d^|I@z$5db>0z@ z&hv&L;_hO*-6hoDX~)jkIP2N7EaP(Wg-QHGFQ-6pyse3emijDh*Wv;uBU^oyOofRF9GHQr`7Bc# zdRwlx4ykLdYEUwjk*!r+0l)9WA1(MrAQ!5FsXa=h!phn`5UHcfLhC~bQbmNv^U~Edy0YmK5Os=RH`BQeri5T?mU+ z{L?7iffE@1HIxvne%t+%606@5tnMj%RrCfY{su=rRM)#l^5^a+ z2*i>DHi+_3H%45CIRLm`{u#;b4=;XqroFi=JAC?6^QdQC8^otu{No`~w1f7W?@62Qh@r5NC*zV@Z75aNdH& zE3vMF-A@qK3m_(hMPG4fBGz^Gw;n(J&G#2Ck#(ILICf0KAfRt!0H}m4>GQ*z4qikK zc6JD4d!EowIluP+v@|hZ-UD0u4sQMovIn4J#~g2GV4L0#TN`_vOy!B>fp=4ep zOv}Yp`Xg<}PMkh_qIF+AR(2Yj84Y`Mb6b1Iv11(_?QIGbdjMI#y->0E4y7z>!=23L z%+xnnV79_U&&WD8HE6RTb|9T_vIeZhon;$1!`|Lr*nfAmw^*n%sZYep$IxIcIbPE< znlrk0l)Uf6`wQBtAU!@L*u~0=Uwxu;e=XSuMfsYQV@!5olH<;l$`VmVHqX^5n46W! z^V}8Sv(t8`m$#FZb7)>^?1~k^nWb66bgt(v-{dTD#P;omlQgE1bf4}@6CGM>9e%k? z)tWp_dydHlztp0AjZORZo&WCqg)`s$eCy8D3$2GQoIQU1`JeZG$SBF-N5o_ZqpTOK z35vAY7Zj}`2NQ^Pz3N57An1faz%ur^pVVKa zyqVFi!2uD`v0UL{d5R3@Rb?z+_wt}wLx}?$8($U!zGlJ4d4*^N_}U_t4A88vVpXe% zW(8lxgsla&xAai9G-|X001@REMm`B;^yfR#X)ol;=y~ysBhozf!Q3PWlpT zjl=;|WuG#dnfUw@`xrlB%b>Qdb4P024Umnd!)=L<&fv9OQzD`4I0949aW;Jvh)G7?u571+W;!ilO zvXvj9_|w$bP#-kafWbP1%#>tWWVww4wMHIpNNOI57euNo5M!anN!AN8InXRsQ<{v4Eg-C&pwrWA|Kr|iXJ5$DIcZ0 zPXB@)CFF()a=D(d8RZR!k2MLY^c9IaEH}Bti)w50a*DG>IYmNuTX$|I!fqM7qzJeW zo-SJ~{1cOMQc;$TJE4qk&Yk}L%FSDM9{hUe=Q9I}^KS+Flb{0jd|<>fQ&{(xL%2z=fVxNwwq-3)KPw)uL1-REq{d)kg`{@U`wrsG_Kzh3ZKH z)dDZCx~^}!FDs$iNT6E5Ky^fE=pu7+s%-IM1yxtOL@3W_BxNb6dSC!mX-2WKij$lx zBTb>qbP!bS6thsRc?+r;3{;C4sP^L28FK)Z-8YQmtyflr9_d3WheL=;W7p*2!$;7n zvil^6Mq7y<8iJ?T+I)q{)q8P@HyMR8eGg74hmYX~*xPL1 zv}P&MrquY6y$Uu0Q_cwVQa4yZ+0i3un<3-?W#ZY3tF|M4)yaKh{A6Doax=qYyIy4`SFY$K{}C z?~RM*>KiUtWIEqqiDP=Q_v)Fm7h5>Mlty&H-`&C1ZkLA-BFU78nxiE~SlB^P!j%3@ z<irIc!~p0L}8nOJFSM>LJ&x`!C{jf9%^Vl`sYXSh{z&LYxwomgCSG5vNQ-pizwH z|7LzaP6b60q5N%@vQe-Wm6Cfb zQp@Xs)I2UhDkh^iD#hs3!%w)V(*1!_riQC@z2Z~lus9Bbew6B|Inm+{6y$R;Jk<35p} zH#z33z$&3??{Nc92p$wYxaoipPSx zvO6Rqz=2|YO;oIcvb{G{;Q&xSt6cd-eue(!gDaOVoNlShY-lgP#EztVgt3j}3 z#VZ5bXK+~Fqg`3pcESdD2ev&(1AjtF{mteBv|o)M&w!SiuBHSnUKhZ2p|rZ7#52X!%m2lKWixs_5EE-{ zWt{-%){eGT0$SLvP^~084A7F5YEg1hte@qQd02NhS}R(I8(qGc}V3jNV*|1MP89jQ`sL|b{IG`ufH)UI4mY9+&|n$e=5dM^QIy%Mwm#2x4z;12ZRcLIxFOu~6&nVP+!M`kfeCML%IyBYjuH!}DwIFOkS{MNJhWu$CE zQhJb&e|Q`d&yoqQ1HbaO@QckfIG+3c`|;~6u5n4lqfmBS95(9lI9-gBA>^7R(gX5z zGT?eYedT-UW;G>#FZCRdlu3RafZu{B1%A;P^IrV&*Vw#;UoIc`RjbR)4ikdESCstC z1AkQtOI{KHSHx`V1F&=nZ8~g;LLjmA^0*@s@EfAQg)9_Q& zY4DB%z=#tAzy7hnZ%!u0HL0SE^cLW^4*2~8_+={b$l@M*94=#%C0a*40wTCac--gQ z=ifb7;efrehaZsjX^{3Fd_(|*8Cy}fScw5Sv00fJ4scA9lw! zcQM)mZdLAf$?kPCP*%k`5sDO$N^cCgj@BgV7x0(5LSG$$B+^gcojklJo2wS+=45Y+ z48dsjzNK=;g_}$(X>tG#0A99ak+G4%>=|$krjf^E2Ede7x2A!XwvNv1C0l)B1jwt9 z-3ydBrzM4Y_=3Is*ibKf8|RqBn9$^+oLFa9FaO{`Y^RU+@*(U^Ai=COkuWLJ+iu;G z#fz81d3BOIPj4&t6vOl66Jmw-EMH zD8`dKr3TQqS1EJ z&%yrOo1w;tu$zbnB@atY+zT`bqv4~uU*@qm%oq5v;W-Qje`a99c0X}HI% zw#iAXKz>gRRYhPiAup#-0FzzkAprD)zd&cw9gyWzwN)r&)$5C!>3L>BBxIZ~XOs;hL21KW( z3*sYu?YG(D1VmVJerBYTi&sD}CW&5)z*sCsB%~1ei(y%`ul@R^rlw}Ak>GN1amHQ* zs^SCK=@)@8%IX;X`{U17350tY027%{08F~{iD%1X*kEFlGr|;_i*Q8vY47htpFVl= z^r;-qt&}N%ma{IyK>WVE*~7+T8T@{8dX56WVj&wgK#CZ(eXwioF!;8z-QlzYcRH8M zgKJA7vJ)@@!(@<@*2(ZeYb-#Q{PZbC9_L<49^E~=59zIfG;UNx3_rK_=!p}Z$2&WZ zHWX&&RUbKa^33^f&Yn8neq>)mUBkY^t;oi5j;geG$d0We%J=Z0Lu`VDU7k78$csDOJI3X#-ajxFX*+z?eX~wr@#IAIJ*nROXbCZ*K`Gc6tCCsht&FF#Kz%o~SP$Z@bRf`H6 z`>8u3KPoQBE113TBo*9bpsSj^kM$b{Q&)zXL#pjfyIQ?X{MnjBDtWkqy2yRfiJVxf zm?M6kEysyKmb)dD#BcbxVE}jc%KEW;t*22^D0#|ax0zr!$M^l%4N_vaVC6amcFSPl z4lB&BH9^)#y0=dTBM&vgI7D&Es#hP$=98SYl`+y-;k%&Gs_Q!;r|f#R*IP;i&d zQspNL`oYUACnP93C$N4@LbDxx+;!~ZZfb_;SRZ$L*}BjeT*>ov_X!as?g-qn-Od@w z?xfa!?vlbFcn4(V4B#NVgwX(xmUF*{u@sc11NjmXGkAiSEc;c%x^Qw7e-PZlUx25J zXlz*Se#(0tv;TLXr-<_;l=BFI-_Ib;B$$ml8Q~5)-F^Li@CZzdUBX*o8kI2zcTTv0P8)EEbjA8@_W#1$ z{jJB4HUMv7H!!@F-B!cDbypYOjc6bjCj;R#(7>%6duWIoKLK!oTl%Rga4Y>?h5#+; z+gD?X`C#iRfs2KNTen`lpSXD_xo6^C3gS9|xK>s+_D;K;Y&Wl3Y^bNs+!Z1BM$sDA ztzk-D3!Uj2W>J@3z4`U#iMryVd@(ONnk&pLt3Pn$&;hi>HC1M(q~umM9&BxIJF*{1 z^@_@xrbDf5?IbKqw{tqEW1BkKk22{lhPGHqK+D8#gu8MwMM$y-+pJz}WH?7xd&W|S z=xnaz!YLX?YwdR-a^U6T<+yDNS@r;JvBI~@W}S)N6x@UQ@=Izgg?oA&NZt=W|BNvj zMvfXi>c!h8gQ#jxNl9fz&<7Y&oFff@*__| zrbgNtrrS3yoQa>Q4`)|HLqhizI4gRcNtc_qci93o1(ALTMej3Bt6?pf=PF|QL(v$G zPKwJ0A~ZZ-M$dB-MNeRM%P!O2t`X>;V=JN$8lWROu4{+Eit8udm&>hBB|Ino#k)Ko z9)?nL!gFaq%^QewToMnO`>-_MR!bE00Gi7b!7-wsLG$!nrGiEpmjuU>lX75Q^f&p( z5t>&sG|z18Zn@E_Dn6Jd?}NF7mC$H@_4f?G7BL^nu~%@5p*fbQni-rA7SSQ{1}TH{ zPj_!l6Ld5sB#1=Gf{>7~u!snGq*}Nr7eJ&7=$a96v9Z})Zen5vsg*b*71Af^>>-Vn zrSF4#N8`zpg>mP4ZuZnk@+5zE7nJ;JHUddde z8eUicP2JhlBtfLCY+IF3c)I&4OZUz+aT`?ifvV?4lEM*HslJ2hzQi#&k-UPW;-Amb zeRpvc{$+adU*!$YfuT&cB)Z8f1XG#jf6gwSG4&FP<+FBHR(JYaDDf@=-rE#-f2xqx zWDO$3&jUqq39*}k!q_zkCEit#4I}w5sAOD?CjJDWyc8sdSqw^dzlZR+=!qI=8tcX6 z>+f)Gzq$iYneeU$bSEDmJwtZcjbX%ty>T7&a32#jdj0w@mw&o&`bhPdoWu}MCp+9k zL9xVk!gb;%Qx;#7hB(}|#|K%90NY_G&&C!hd2EN2rZs5|iRLK6vbn3A!g%ROGN24S zZ3?6@FD5t)U>7FFgxIe&xAO20NzTg%-{Iuy>5U?1_wnfM4+x25w#*Ri6(xo^Z#G|M zz6Qnq&T^Lt{W{vsjn&a4MRxwePglqrk_0kZ3Lk^KKrcXa@<_qKv=WOWAUbg^x__4| zSWY4IfRa`0Ym>;spLjj+PRE>;?E^Y}{R5ah#KHLH^yfrElPU=X(8=z#o!o&YtmF80ksL!wAYL7zIl1?=cAQaITR(uC#4ls);8|NsEw-o zx@LEFiXfw?s$u`Z{f&Ee7Znti!5xQhLG~Z$c6rApWF43-i2c|@ZfdBy=j*x?=1CDj?*y-Zx=I*l7(Qfndc{(i4XN+HL80g=VSTXKzA*uOivKxH0()_j}HspwLL1uZ@IpyWmEx7nAmX7oq?ea z=4Q(_`10euc7=pESZvv5s;{ZOGg+L%OV0?l-xcU-VW2+8At5!1pOGEDWlLy;g~sS9 zGmtnWlR9I4^(oV5885L97D6`_6z1lYH#RpN>^yUzAw4+j!KFr@@T4R=eWUf}vothJ z?fn8gHk&V*Z!kmO$b7@rl{0ir&1P%Q(wwd-p|$$^nH9aw4AKqCe(=VQF@tob*O|Vo zW)O#}XdvByt%N4^p9@5nujA9C0$PM(2v@8sdmFfB(TZ<%5PvVr0NoS|yx)uTG9aBC z!6HaM31j57PcLJP5Q$EZUf7RxI`DOn3WN0g0Z3oB`yHgSh0Y{c@%%kV=O?8NLV65A zdhJ_CCr8OuSbHZAUIeXtUjT}hzk|H%wJ)VD@YU%~m_lQCD zQ{C4FQT^Z^hU(QK{{d8|OuyU_^bXVu_ApR?nWqM(1L{`&ouLHhAUXQt$eRMDgfwH0z#9Pz zk!T~8aPsTJ5p25*YvjQ23UNG+w%Az7wvXI~z6f%$1%(lqz{uBd)>3OehcN<{F9J-M z*&vbzT3Qlqnw;j;>P7xSUt3pq-WsRSgw(XORG~11S@lVZ4GoVIrVCLP?67+A8e3Pt z#2j(dPRCuY?(S}`uH(=cfn0DLKLygB2=!oR%M~kDTR^AFT)z4joc}_qU8BQTpJ^=)H8Ve!@KUH>=WOEd8>m=??!%lII5Ev zsE_GvKiF8!K%MNjIWSOnknb4l$k1do-lFF`W-v0mYc6Oo^7~jk?C?<`y~sPEjQ4a zqf7ezNk`B$Qor1zsAXnlI?k*RKogmMnWkM)>#Sx#zL;e?K2=6){C}Y7Eb?jI0;U1_ z5Asu7(fq9VR-|L%57HPdLW$6KwCa<;|2c-?k@)$mQ}lC;8N~(n6}HQp0Zf1H*TXP9 zBs7_v-C|`r!}MAr(|NeK6+w({oQ7Q_elOFXM-iF+JeJN;sPxQgR;BZk1cQ(sMUY;v zK>C}OH?4HbZ$zn!24KCHk?JGLxzRpeAu*_TlP60Aw;8GrP3H3&f%Q)_M1!1{fQAMM zgY^+*t6X^=r_WY5HOiyt5E>tnD0v7SOGnaSbm;JKY@MWMWJb%ey{wj4B0g8b;GA?q zD2#95oRk0&oOkt9NirqRS)4aOk&mpiW^m3N(;O(#z4%0;bDDwk{AK+jU4irD4mof> ztX^Do=FG*5r@OB+Jg1XX7?s}M^iNT5;fU(=!94%KAt-?r=@joHR-{+t)+j{!(1Psv z)MT<4(t}rrRq3B9fKK-7f}_ZOos#Emi3*-Wu%@P`?NjjlHzm(ueg}HHdj>`elGa)( z4so^h^ZcQV$r}?IOR*(JZXDw7;afx}z6z?};CnN&o_tN$FktEyPN}}SqslNHGs!Lm z*2yLabMp`#&NzUGaUHqJ{Q*w4T)B)}vK?PHm5O5gob9bq34xwZkR4oSHa|%78@2X} zHTYo_lFCaL8P7MENopacP1n%Wmf#=+U@ANQ0|Av0>q{ z$>~De%yU?4vT)T_=a|gQxLpoAc9KIc&g01i!vGva6p*)pOdQDqHk3L8cgXavmyA@WaeDh#X4pvNIt%#jr*hOmNS};AKKaq(-wKNL7^k{3VN^6U}bu*KvJ9H3Vk9`la zT~~pgPbJ;MoHi_h1vB+OUoQ7c75ZBmBiCr}>gwj{7wG413%WZvpq6{{`c-Bo`a07m zPxxy5xUpl$$rWJ_dJy5IBc<;W-YZfVyLmmgD3cc(<+^oSP)z#n5`JP{aejJceuB4m zL`rcUHzH1W%3O=3g!!TrtEl?{6jA3k!RvEe{=R{E7Izh$8H$b6~Q zmTg|X8>ef`+OpAX#YP0#*RM8Ouwb#(PRor;b+z@>r)jc~AI3EPkY?s_-b@E4>F6YM zS3({?qS2qCRS4uqG2F*bVSe<+r$0Vua03nwek%DX_%iaXKK5pcgvfiw|AsvAVw8}V zGTwTRzbxegQCLW*@Eywc3PuUZVMWsP!yHx=5X@7Iw@#BFiM(%~`6lKcciDa!I=66^r}|g8Zh{MY2dB0JJlSTX&GzlqSa3>R!kPc;*tp+R_Juj7cpLsE;%(wzu+a>iEr zn*?{lNxYBjNe=%NClDSm_kYPbOWA$Gcf4ox@xA-TaI8NPyq_I)vf~hoca%93yxY^Z zQ^+|o_rRpgLNv$ZBuDz#tuTOspFCv>{$K*s(C~8g#iagin%<7)?(WAwcGMN;4w8Y#^aMOezuFWAY-TpPyYZsfW$ZxH5ozi}Z*EzKC6)Ze;FqRpB^GX>kE&nrW%Y z+z`hNOO1^U)yGX(7n+{vvd-9Wxut`%v#W<+ps%adrVX1mZ(6_7Z1IA*GqtBrneY{I zhthFFVYGjNTnPdEhkX)$) z^GzMO@yR~n!hC1-sTP{JzpF7rV}`npy81M2?UnJ3`wtvGSXbKAP?n$I>njkSxcIpH z_RWOgt@GxswAkh15#(Z^qrcd6wZ*#SCi53A#nZOg%C##N8%&?3rK2~qPssm4E4!GL zLjEnrvqGNu?J#GQLLNU36!MSQw}rlM#R~cV!T8DkWkxU68JSKNKw=Fhd3Bv-5C%h2&N; z`Z%93NY956&hPE#e0Qs?!g)C`&jbghEao$E_#xlNr|=K z{3in?eQ9xXWJ3?5=)Wopv$NPEa(5StQ&XK0U-H1roP5M_BLd}~v=<#p?;0vPd;0V_ zSrr{a#|??kuc@K%E<>R1ux*zB!2XXAV6pk`|8G^ET^k z1HgLH`o^-Jw7!+~vAzU{G6cd@@&!cSOZalQ@S~Y*H^7aR862&P=XM`gttzXKm5<(E z#?-!Lqa;DZPfbq+?2n5j{KtH($|N$YGE5gyI9Cw5ddqgEi>ROVO#2X6PvpG>WG9P- z^7})8D*`U`yD>_ZzW3_>D|}uG-m5XP9(uR;HUT~ycjhO(g44{Z)gF{(P*~`uP)5W- zmSxD#2(W#A@=$ed5}bEiQu78)ztwURwq@uIG7H?-g{1#%HF0W|nl3U%j2qnt@M*NA zIx4!rJvmW5heWt_W*eJtwsY|g2o4R$M4p$J5EtR+7ZQh)9%25@n-|U0HCW}HoRQ$M z!_MBxiP|yMahID{Kp1&vjE@fX-et9E?aI{~w%R)4*O4>+hZvzR<^Q>#w+H5g>n}6SG$Kd%3I_$yG=vU(@2L)S?d3I;agDu7(;zrnj;ndJ5cgwXKUx+>>b9-tE_9> z+fY@Q7U#LnkoY$8$tqK(QaH2Qizo{&wrGx>KF6cI_sy>tS{o`#ic2f&oA)<2G&Jo$ zj1tcgBrM3R79N%!q7SMbYH6c7sP-Yms!?OinnTpVk4SVIjtwbv-a}O`fUYmd$%X?c z4D^|Tj{7PPpj5H3!$O}%@VWQiQvjcA z`XMELyO$w8C=cQjFJA(AFJmM=W9E>?djfuy8;qSpA;&o6m!B{F_rvqY_f?=L$=%Tg z4M`ttw}P8PjCyJV$AWyw){Z7tj@eR7T+!lz!bVN0))2s6m(roYehgl>cAJFPdZUA1DB#TIKj?C!Y8orl2d@say|=IxGElmY0+pka9mYz@JGylGZ*{ zN%eyMuWv~dQ0$BY2w65 zlW=`kjsPPEu}(@;TT4@Ono-Dk*{iPeN1AIZ%gQQh8!=9;-+SON?zXgb96xd5B;t%% zh9t2?s%6+|0CeanjBOT61PEvJ8n&PEQb)R%N*9qrrdnrpVN|FhM3iQXjuqrmvZ-t}|18 zn%2s>I#cvxtJ_bX{-OQYch^g1OwgMjIp4GBMs?Ru#yVQMvkmlTYz?!SrK4@U(b{a5 zfq~vEgt<&Nt(mWD}M|7>@4<0G%<8k~G1wEW3f_p&0I zIm;r0&VMHOaBq1mpDbuHop)~pU5s%*oS3f(@fGjGekhCm&zdU_6uWU_@wiuAonKci zuBa%cj;ggj>e^FVE3c*Nr`-Md$dU5)-Nhv(85w(1LPH7t8yYGrqoQJC>*~&lS*@Qw zNb4)T{HHyIl4ObW-^oAZjQGbN{~#ImicCiBli6%G!+xN;-`Noylr+h~exGD?Mh#;B z?Q5!6&$a$tBr6CDvCn>E*D>58=*x7j)&#~0x5y=$j?P<(t;px2H~rZc8YGuR%PlH_H( zdDAvKCl|MIF1vPOFB6#%t1TPXn46g`U%7S*8t5FIcFL5z|J=(R8!*9KaajXv-jk3G zg^&#m>z=;T!z^l&M;ht1NdUfg3O zyg$|{JE78fOx~e#?6~~chgi;J3rAa9Mv)U<`(XT#lk3p=^4bvu_2sy|TaZm9XAN+USk5^^u*O zvn?z&HQGPWf7enyZG-uS3*Dnd8RERmWKR=~d2{CK=zB(mg~sHSikxQZ>YzPwns0`y zWBKvD`LPx=40JVhHMM4_Pt{!M`<1TNj>4v+r!IA#ztZ(nM^Rd9+u$EggK$;oqKz@(Kc zu^c-H%K^Z0;6WLTb}Exo`=UkG+THROgJo$EC!NIDWvm)URxlaILU8mP?(u8EJqF7k z5SKlH8&fWp)YAnU&Df#I5Dtn$dV_yx8;RhEg5*?gYXq$#sDhNK95t=F&FZ0G71FwWD-YU^fv&($likc9lh zvQ-w_ZS3sq9p9la3>QM-Q{VjX6C&({!m!vuVF{w^6yBNChzmumbv1%u;;>LpUp#%z z1Y;-&?$J*l-S4{h;PKPnpTKB&^bqfBqket-^p8LP{NwkhWVZV2{ch%EBJibvcnU8H z1K=O}43}IbfGLN`w$}E}p{Zs2j++)Pm(838**zKiLsO?qH8|=-bwe0_ zZ6@lX{`|RpFGi*Kt$|-VRm=@7wj{6p*fH#9g1*4-G3q#djPBsHLwv(zKXOF>YEY@GrK;(g+12=cQGyx?ysf8WG7;r(w|de11XpjBui%HYfr_Wlr z*4l3CN_~w95t511lgryhA~0*QKMeHFCsI|E<7eFB|Tx6i6%}R zP8hp6Jx7#VSira2Xren~?ko+PP#!ldG~C+~HLcpS^~}QK6BE+&MIqKEGj;T|C$0{S z3<%Gt$qCrHNJm>&d&=_AR15yOOaCp%weZl>oQctcrtVDLaeijgW-LytYCLiAblb%{ zSFinW;=kWNd-~7c_wQE>pEGmX^ojbLeOFJOs;y}-Q+tm2BHdXtH0LZfUuvjtJQq3k z>9gl*=v<;XkJJ_%#SyE^ERCPh!w&BF;oRnRJ^zB^UlsPqKpc}?3wAZ(i02e5i0lR; zm(}-{P^BuZVrb>0-BMf_8A-%)gn*^;x>l(W)RtGtnepe)nnTgy13Z#{V(B=Q%;Gnx z6ochbwi=qBG#JZ%z;e)G1(x?bhYk0-v7(r^^&~yqkYY7-<&&rs*@}QQ*H92<6!#1^*eF$ z^qI3~8uwsUUwdSC;ZEKWUa(wD=hE#eMT{{Hu}qjuPPj3_mlMns^zWV=NrHr)7zTHj*sYAE?Yu!i_^~RP%3FBh4m6B69#`l?@iu`cK!QND8-4mM&Rhx^ThVIkRWZ z=+>ijWyBU?f-bZ+3ex7F^V!67>9Xa^R&KEO@^ZG`u*?Xz^(N}9^c9E#x34tcywg7- ze4MAvI&-+|i_llLV1cm-bK?-DDz*;TryuIVx*-a6oRFp9@`Zt1CUyw<=*E;l+RtW^ zROH}84lv8HPb7OfgotD6cj^zVr;i`pyZ`X%Uw{Ac7%KTD%CmpD{qXm{pFR8gFM{YN zkAFq(lbBFsLln(?w_h=smgD_PiD?5?C+DW|;v)k+cac6mYb$%VNZf*MKYqOP)TtB4 zkM1iI`fQr7HHBar^U&$)Xeq?v(G>OZs|%jWAAPrf51L8I6=-Cfe=Q$Rk3*5kIN5j^5z0t0(nvANQE#gH z$!KDTyqj;C?-rRPOpHVc)e5c2UwpYdIVYJ{Tokf#vzN^r4eeP={Nkd5gMxgWHd&bJ zOrO5UO&A-Il${o^WvjE9md?aQfpOv7yh3sCP7nX}I=Yhi0J_0KPB?l{%>&4Y)pBu`GBy7}|f`xow%d^l;05rHhaO#l`&2SUDL;c!#&xQ|KWg5il<9Ip z=Bwx#c#`Q}dxnfYMAahz+NFcE=YzdhgBqg+x%(yeikU26UT*#1_>(7w6elVE_ z+8Bh)rAjgvDajl&NHBYY%)u=RGME2@V>d5bo+-#YbWbIw-!cZy#KImClaT4>qp&hw z3GPEP6E=T;qh*|oI?2!YRao@hII`?955ePa1BQ{6T# znQv$~Z=R9Se53is3zx3ku+7HCdb^b!mcGtD4 z{`y<~*9dU=3G?@1@AosAgd633OjgV)b49$khyahB2q4l{O=bXA>t~YO<<}?kB8Po7s zp*h`xpOaVK((vu0`ww5fymb0Z+xK^`-M`X)vSV*iW@bvX^{3R(aVjI!J~Q01e8#L< z^R?8cOu>`{*UBgA=}cMuzDmER*j7e!f17KH%aUyY$<01n*^9N!VzkXt_wBh(!N>J~pEg19(oFm}gm z^6EQY#VgEa1@Rt=q3$Qud14-@E5fEZR#+J7N}-4;o}52|JV&qzK`?huxeUx5N#t-I zu8gFovB(|LmS+S5qvo=0gyHn5(rOD&OobretE)89$im2%VX(!X%$^T=MT4c z^zo_Ocesr$r{ZuV?5!2*o~m-D$P@y~aV?O<2EpduyFFONm)`vw6vj{yT2glRFMx~m zE1`>&Il4j~(N%6-@42CJ3zQ~733wQ{hGY4MIgIxyjO7dG+MCNW;{2TvB*BSJ%5n&) z1H{ol@?r5gX$4$~B+0U6OL1|<&|o&K41(vsb>%wbN15(Ky_s|7FI~H3^Xi3jv?hP~ z>6kAk&fXT09%r-M%sx6ZJ9dQQN+bQ*`i4dejO8X{7MZQvVv7c7+?v^;#IZN#hOCdw zDCL%8C(n^3eED^in>VC4C8(W(PG+tg$e2V8v2k!#<&hMfsszgPlP3W3Yy#vzo<6#F z>-yDeH*R-5c>4GAe}2FJ%Qr{rs;c)M|KUd0gNKiw{LbiPxEqfiBAKJ;qJmDA!_FY@ zWUw{*xXfzhk{l(Mq3*YDBV4WlmpeL7ojH5<#L>N_$zB@_A(khTozCe1GnxQVilRQ% zasSKb7Y~$TvXGsVi%MdWh1yeHgYXG%#qP%qD{^Z^*2-z2jtnC)LF5FfeJagO!{8>@ z*3{HebyV#F+_EZ16t=3oI4@J2g&;>dKc34^75SJ=_;}K~=-rtCYo>qk$*9qvkNJG` zCu64@7#Zkd&u1L|kYgL4)c>iD{ZavFvh~C2<(`qf?*ckBF(KO9+{n^3gdbCL!&e{u_WbqB`#+y97sf>jck=_ho$*v>_2TV<4ePs6&M%G&va<4MHR2p^~?!UmHg^{+|dvP#RMpbai*CoG~pj6@*S4 zOlUU{I_#*N@sd@P^mno%jAEOglMvrdpC@X6|b>`fOlSgr1_`m^bKYc*;;Gsj*Vc8KGb77u7 z$ljQ5{v5yX4z{#)9>d9p+VTtH$mZsfv((;?o8QN4Q9F43swW-1mZ7fdJrX&R;dRkq zUY8MGmk#1J%!~Z|ykf#@M{%VXysoS3?7laE*By6BzTsR)F=R6JF0WNLcq;B;(LA+M zhSyXTi|f(Vxdhi~q!}cYBtEEQ8D9z)gE$z3*O=gulplCqG=SI4K4z&f1FrIrwtT|t z`{4B$lICVxRJ=mscm&s|BDldDS{2RZqQgt&Sd296qu{W>a4)wcUOciq{lG?jAclW$ zpc}Dwf{$JV+{oxp224w^vvcPT>1lo0_3~~nP%XLh`u0$!T!aF;d&v4uFM<*uV!?+j z`Cy3$?yV|9-bjF4yE^j9&!{IoeYCMe6yv+gmfEJW#Ztamg`_^dVng20(S+34;aP_L zOk*QM{n<110BJdieds>YnV>sE-`H%$(gm}$r%m{B%ok%PXsz}W@$Ah^cL_`KB0jKL zHqQXc+SpiTGG_7e4cl$4w{G5OX~RMqRUahW(Ff`J{iK=d0t0Cp|J0IOJxnzq;WL}+ z8xF!gehkx?Eat#me)1T9HUOf3|KriEAJ29kKY9M*l^b1;|NQ&++uyfV=Ctz>-27|ys#Ks+BfKCf<(h@bqn9E=`*17p9RE`E1z!6_2+V-Ot<>1=Ofg(3nw z*YJ$$!)+Zv^x1FDpE-WGHao(8$t=v7`74RqYpowIAitzB_(%6y`hruq~e9qYhEyyMhey!E8_)s6F4ZvOT6i*t|ZZn^w!qRrNgb~fDNgNMI+ z)^+*u-5U>{-@MoJ=E1!`Z(jcS=8x^Ce*PCe??2Sf=QHpwh=P8F`vTx|F{7ZvLW2pP z8wsC9nGByxvfwI5HL!dp3pH^OkvN^r4I&Dt!x=owGdWpzT3#yXtcw5QR3DuGK?0*Jo?IPduMNBaoN4Iij~O^~ zV?w+<1H@u^y;SKcE9u;nOXy6u(`6syyudz~7VWKMSAg38G4sw(hSKeDm8oO&aXB;5 zpxY-XIvlVOh8sYT37A43J$||#qrlEQ-Vym($m)mz4l^UGOH=Cao$qPvB4YXGVv zj}At4e&Sow+QL05nO(Ky@v1V3w1%NV<-g3Ak<~$`)fKorTlw<^;bw^GnZk}upJ&Rh=>dc z;c~Ikz)MVwkC*aLl@@_KyStiwCB{bXQvXkU{rrOce0DloZQZzW?fQ)yH~q7b#kVTw zS5g7;D_cBBTo2L&`-U7YULY2c=acw}s8IYg`c zmP8@AfpGW=oa>(<#X;6|TI-915niyUv4u%l(wk{yw((&>uUA>OmRdcAIdaIT?FB}} z4bemO8z3&%;plej{DT4F*SfRjE-*%o$ka*52ao@1qWTiVaY6W5ILoPen)h@NYR zf@outg(fBo7q8f4ZEIz@VZ#<%CuFqA4a5IMatTN-!Nia}MU21@l*I3t(1!Fk8GH}< zlRx22zpPj&eqj+;&$;YQ=$;c0%&=-<~_wzOPK+vtho@ z)X9^lQqzWl=IZ2ZIc`2qRmaU3-9<5{pWirKithh(9ExGjfDqALTi?*sgf6%*iTr^? zV&Zw&xvV8RoBVkMOlchRuByhaL$w+%c%kl%D%3;kHj2i?=_$Z@0yn~X_UEIfnmKrF zUpS4xeB?(Tj`-k%(c`fSGj;q}_#yB_zEt@FW(cW%rN5LZx&G<@ES{{n&?6%S{jhPd z+@DD;%)jsP0d&nOl_ zt`OEod3RRbkVU?SZu|P00oENmVV!%g;@dB<&IoJnO!n}h$iea1|2h6wh#K9OsL`(b zcJH*Z59!2p=d5TPu_y=?;`+D?QF(O@r;Z;*IztKhsX{Y{&9CFtHMMmoPS&G0 zq#LP5rh%y+bn?Urct*+20GWkg6haq{1h$tQt*kD}$w}jK8{!*&2kbTk*xTC!0qpI( zH@^aVya?EH2(b5joC{zVDkiZ6*z0}+>?s7;4WfYTTrPk;=XBeXA2qmRIRSRD#wr>$ zI1}3|#@m{8-E|HT|JJ~PuTEgk6ajm(5ZDK$MTD2`;syku1_!c#ufloIsRg1c94X#h z0_>G6un(|G?aaC&z@E~PEK!`z?L>A|?d(qjWgmft|zQV{ZgbV>J5`BwQ9t^$2_tM~O+1 zQXP{;K4x&D3yQ$|4t6H@4QSsEXotcAlp?wb1MdePJ1l&5;e-RIXYN6spze-ox^wde z0PI9XcC@$ccDSXXq6h9E5e2_auhYX|Cot$3~e0^=g;08l5k*KAN2*Zpk_lqnNKemx^S`b>a}YPbu_gN z*c3y8=)1br=17gL>J(6zrgk8D2N0bBbqy3EIshG&xzL42v8c{z<}|;D4FqfS&5CS| z{`f*!%E74U#LR-ysaduk+=}{(SFc<=fA+$)rU#E6(@*=rkd3h; znL7#|w6Z!4t3L_R{Wf`U8mEZRJ=oXHVb2aTpgZt=?Ivr#g#5!t$Z3RAXHGTLR^&#z zZd@@{Y9ew}s0kgC5-8JQ&K{+p7I@~v`P?X+Ne>E*h>kfJOQb-6bxv+xK2<;!4#Ud{ z87V?U&q#v}4>bqw-S#5;mMN*J=~Tua80uj2GMb7U!AfXxW9oEOd$;|2w%UXpIsfR+<#We_Lu#~cC51H>`_#ODcYKFp|AB}Nlf{w6 z<+e$Q?uWkKdjR$8P4nBAuim|W_UO*z&tD>pHq4S$oHKu#+^i+0`bwjxsVPV)$&4KF z@2H`D1`QuPeENR?`jNs;H{O?@0o^}_NZlyZt(~1+^X&oXA@S`A;)%shUv0!~9diZ# zgK$2XtiH2|?&{{Tk05$5YHfOL$skK*)E9fUrTA%FJ#dHMoO%o)_QOZ28#3UrcFxU?u`l{z2kCXJu(qz+lwf*C zyFW0!6>)`362^{Li*L|_@Sc`IenexP>L7v_riwtl)IGwSojj)G0Mt+X3hF7TkX6Fe zR-3t`rE!t&l7OD03`2lpOeIr_kLsCA*V>-8^57Jq{3VY$W8+%6~|mYc*+?vs|BmseBc<`xn0*^N2ER8bX7CKbg5B2&hMF(%$Fn#&2M ztQo8RmV2#jwr*Z;tf!};p{4s^b(`+z?-l!Va)9jlA7mvEXfAjx_5>MOu#upMr!b(z zT0NkgX0;ZIgl0o?0lZ^vgbXh!eEu^e@(yg_5VNw_T_8GzZzucp2=}{>0o@QxF%bfF z`AltTT9}*FX3P+YKF+M}smmfetu<7WBpi}_LxSx~5f?rOvWo&OFD@r9$A{gIk@+Ic zNR1`wDT)N)rN{m|;-7yg~H{=kw#kf&zjl+w;Fd;d&vi|(JlgG--YR=!fb@SHUM^A*l zYht4$*B)E%_Xg}geuNM4U#0H;(ex|CTkqH;g7^))J)^VX0L10n#>R$|HI+qaA=bKc zWr6JDsd1bM{E6aFWCW6<6!p00n(NXcLPG)rgSnAt`T+6-LLoBhbrnm7LO)Y15=Px$M+8@yWgP;O5nn)j8n}_q5_7!fP((?6)z9y4`l;z5-A2)8NuUA9s(_8PFUpC)+&HMcB?eqKh&s@0VX6|D-bNUQK^eC=SSCAYhqa+Dy zi4;61auX)VOd7Ye1(5)cnGU=U_{CJx93plkqtoyA1MrD5g9_e1xhvqi{T}e+S-^LP zG=l{fM;7oCz5{*=0RKk?F96^dwg(AV;oM2+YCzs_H^5&Hz;^@Sw{xj5v6$GVineZm zFIK>9^X0HbJRBultKGIvY^oIjd?L*Z!gEgi#Cy&06_-eEZZ7W^z)x+SbysDx$_q;Ub=kc%2oOrbzOk-*-BThT)BMd;)V0)&YWtjherxY z^~C-U?|&hZAgYcQW+xRnIi;F)g?o%VtIG)73)+1F_g{G*+9kM2Lb%_Ehz&=L137)00G` zTy1*>z!!U%LlA$5Pk{*WDHQg-V`IFc7Ip)Cm96^$_+)#&pU*)N;K#%Y0l$B8XxL5y z_(-w!3k;-0iVe?~gSsAg55>mWPK5Wo)Pdw64^eAEgA@Hj!wOiqkJZfM))W;T_i9_q zFXGe)xG*g4r>qA8-0gNCP|w}N&Hd=H%1Ugbav49y1{`3-7*O5degKE0IPc_Bhe`np28D8-A=y~$Q67T#5E&j479i$9tl!}4tq3;heT`UBVmQc?&T1u%(rka=JM&PLy1AS$-547OG-~nWGY0&EfL+-)L6*| zwLK=J&}>L;PedER|$kc`LWst;eeEZC!LSJ z9=>Pud*_>#ke0zKO1Rl(f(*2`wt&KA$vD?9C0?i4J^}(_~RemYl0ZhkYO@{R#4&(U`zbO zC=4hat#_EMr`Adun{2Rf4oycS3VUDYSY>%>ac-Qu=`tm0DM@U<;E?*niF`>8@c-Xg zj+M7=R-{C6g9H5hg9v~}9*j#&OiInjpffp;*)cHB>6M$82lH)aI-Mq#nj%P+NJ@;0 z`2$zh!yvlTk#OQh4~U9{`w99Y35gF5^rL(SxmlYk&yt-aHF3-3o zrRg2)?h_kjxpLeX83iTjG3xf-NX2&Ft20Ade#)dVEA|Jv+wa=zyiZwr@??4GNk(?A z`}_`gT5eU9my}bGlQVI&FtR(`^!Q4B+0jE8H?M?h9kfrXxmK5c#C+bM>GnrozNt3o zE%C>Maig^NJ^uLg-mCJH$M1K1Y5Dl*_Vtso5r+~EfB!!VAmfxqK}8g8e{@XO8yC_0~ZGpwTX zZI75seiuH-2>&e~#AW{A19vCSax?&eq2Ku+I*#Yi{$0@_d{89fgGf&yA9%ZU=YzH2 z1MhMXAEag9!IHcLx8zVQ700k0fQS&v$Rst`iI`m+g?l+4{a=1(1OimH7Q2wm>K4Y$ zZU31OveWtbOxdLRv)Q?gC(!|r2H-F;x75^~M00xn0{GzC_3Jlq)!_DR{vAHDIG9_^ z&7pvYtDuGp=g*!d#BdxUKcdd)g29D{N-Jw}QnIVv-K$H>DutGCRnvMhlb-YFO55}Al;G-^p7j_>-aSuO#l?|{D@eg5^m`Y;TQXv?@|Jx*gcFD_ zF(!;XS&<$Y9~1LAh9BKGA&~1WO8x$1c{+$p8gs&CV{|7R? zeEjQq)tm|*mvQ3n9e`XYJIh_L@j;B&)Yj|J|Dtya1%8XD!0$m2pKN_UhgkEJ-H?av zL-3Rw%VbT8Lb%5%GFFBsl{@DlL2n*VoRs-kHh=JiRUA5cA>s9C&tHi>xQ++GheMI+^@%pOdP8~4z4(~9GYBc6K0xY z&I*wp8a=B07t;L+-pj*PCNDh>r6oOVz;L)R#!Ql#D5<1owqxCjxpSt^m_B{l3|66E zs-mU02J*b7mY#{(w(Tt5lS^z?R=?o=C1QvX;yv-GFlbsx#ZUG}#UA4!5o4DnUwuM} z&oqB{Esm8*e)D3CUEjWa)Q}qD?T+OWFTcpF(jz6QA+Gk0ULi5@$>{}0Pn;}EjW`gN zcjD5C%8Hu$vzM;jc>s7vd4C@jKBOa7>gx62$)o%C?mxhz-247LNM0huXM+=wvEoR4 zi&b&*a=%*!>CQe!udG2;Y zVPZsZfRBfpCoWwFhJ-}|!lTfglgu_q@{r~;;1|a~>4LQ0spNQZd^9)kFJCXr>dAE! zZ(pSQVDcY81@;O;g7AR=A8*=sl=Dvg`3kt6H*VC3;aKB=T;I1}-@g3^{xxLSh=2Ga zda|HDtYav=i^Ii-4IRp7<$79}b`H!J?%4l?_a26l63V-JN{G0yk-Ivsyh>QFfZP zmA&z{swYhs>d&4&bMes;msFJ`)8dNTML|{0s&iJWj~b+s@VNcf0jWPFhAn7nzVrUu z{uvF-myge$UTv)Q^{6^ll%C_cbnz^CDai@5rUT+-vAQXZH0JSA6KPrTaYM{_OwY?f z9ZdbfM`ZcO^*!^#vE?fx)*KZ5Ux+VUz-;*i@e4(WzXy^}2HJt|lFv6A##T(I`NU;+ zfqZ*E7V^WWbUv%%i*Z@V|LpYHxec>f0{JB($d7R+kniW`?daC61y}>f_x%p}S+^^A z1oExAL%vY+@p1W~`F!wyCDMEbvNFE?F0!NP;lceK;%D;nCClDLMAtP`5xf_A8R6<` zJag{Cr7Kqn){BlG;*~~T2zbpk$&#CnH*Wy+3FhOFRqgSk_}%CP@{tKwSzei)kjZU~ zItsi`Qof zWy=;LqXi3`f_?&gue{_ZxA_F{;{o{Z<9f!pMrbTpKrdvlAw=+gC601-;(fFT@41Pc zcpt#c=av@*Y}@AN_rg3_# z5gHZ~ixiC(};C(-mwRIOT_5l8xCUMmF)Xf>V30GU15$IzK!)x468jd!0{kAAJdn`}~LESk>$X`!qECj^_DT?R@jP>3FQSlcPIuF(fwY zP*GO2kNqBdkC4cig!IBAwbgl%J|4k2HK!}`vI}84J#p^Fy+@B9-UHN=KYb*~@c#X# z8`o|T3b>DO^~d;PC+OEzv3ckuSZgl<{dJ>F)|qa#@s7VQe4mV^z`=e59WqPLf?-) zNF(u15c?;7TH_8zM}+#h?(4DFYWGeHdZ*;>J+}Bw7#q6cbfYhcdI<3ILQJZ+!&Z&y z(i10;EZpJL(0_Bh-x zHU5%KK~5`2{iU!Y#CKmnxXYFe8!U|%%Z;45#>y3$^|m_8O?IxCHBQ0A-pR|=ZkxW| z<{&rivC^6*j!s^F2duSq&3yvaD^53c@!REEe)IDE+t=?seTFNM)kn4VMMTwKC{I7b z)mdS%Y02y{z57dF=|?wmvQqNG<}6t_Np_;l zqPdE)QzT`jWaTGLoGc?dURp|K($L*JX5#5ghUvJ>1T{DN9kdTZnP0;&3HFYcnVJ+& z`&@>(<7l5iF`N>(PMN{?Tafn06xutU#+U6I?d^kZQ1+bniN9xv=c1j^9}Gb>BJ>1K zxgv(x>EP@db?9e?;8v2UKw=gcV!u5r61iJ*i_sKBrT$=u99|cZh!2K1EM$nWsSui3 zhOj60_wR|gz6SHv)q_fLB8Z4Y1*JDD_=F+$unZwUEE^Gt%E(ZlFr|xqhY$qA&Uput zp@6G{m4)R#a$+rt+m<&6t4Cd?0@+#l`DJDG4cR%TP8>y5kA|SUvZ}hS9__%z%isq> z4|ieKgR$=+{}H(cOnk~CNGS=HAS7`aV={0=O%;lv;zByVe<5DfM-ct*l5bv9zKegT z&+!86h&G0txP19sI|l^e!TW%`T%r@fTG_vW=tQaMLY=4_6p0UXOGAcAJ@< zI>X1ZD058M6ddeq3KB&^5t;(AOkMs=W)?l0o+3JKy=djL1A(5k zA^zs(@$KklKHhG>C2{sxVl0{e_Ka~0)ayzR%gyY)I|(8xjFe_+>G8=zf*2U%&D~YU zY?f*9bU zgzEnePXj0dg+FoT@E$_Uzjv<#(_4g4H8JKzyy8kLk^dAu?!+}9`iP<3@)N_;|Wd`fQFiHo<8#4dEB zf*VHNy8~nW{aa`1PhGxx?fQ*7FxfwQ^6)Ovf6g{65D^23QMWPQY`Si}>3Y0v+2bCS zU0zjDkQ|A7#+WGQ=Oue@Sv5swA~DP(gc##*87a7U7Gq*6zal6j$=Asa>k?Zwu3wLX zPnLUa?QE@(P>Q?9`#=<4q~6E+3)D{JVk1w2l>6T9j(fIm>}P@~Gz6jP>Km`$w3Xf= zWp0IBPj?S5AAGYXUgI8i8&={->3HIs8a9mdWr$3N-2XQ{6s{e?cY^4^Ab<>eh2$Us zau`GpYy~^~!VCsm{UY`*n7t)}8*m`P-oVsrpRKLQj9G?G&aOcb_FBtKEp6-!=4tQP z=jP_VM|bt+Z2_tNs}1(-+2`o%Yra}td#`h7sI?t8#O*-li3@k`Hb1#lAL|u+;iS(Z zs{;XdYYR(r4zAJB*s8i}`jQ26BzyOg_P_V-OY7^4XDb=r$9GTf+&Gn0b-m%{sn~;u z4m+=#J5hd|?EIo^HP55s@Agic^5U%X{2$AS3 zY(HN?2zeqxFn4fvi^}do2(31>tr)iwMw@_vi5VhBz@z1E5er7(LU)?GggwW0vgoza%zJb+>p9rDdm*dA$ zLY9ZWpGD_J)O-KetVr~iaBP51*3!<|-P6mf9+WWcCrZc$CA{NuYwN2jgoMBjwobEr zKu)FO#X^RNunl%Rp)i!B*=3yJ#Li7P0WNMr361r2)yFCiLnq4bTZp5Rh1rSRfbz{& zoqWIzIdSar`F4iogLjD3C1c`W_@I>VL1YN{fXVIYXK7|u&GLcRQ6V8Lj{qU0kjX(; zLdgCNA*gZdFSWfSgn)Sg2qB=@Jd$^tcZ-j#liObiC!~lt!8>?US58>E$qq-7gd$NS zI02$m`oWZ#m`^c+=zn5-xVyNGwOk(`Ze1PpUouoLFE1`We2mAXEGaXI;GH{mP#*m) z_jm+2I=Q-edinaTUCWDtm1jRj0I>2$HlVWR)TNvE&{H)bi|cH|UmyYmuE(%MU||L#*g%_(+^~7Kb68f{(UMf$ zoAB@pj!MqX&*oa|%#=loFk!|-mI&~$phuV_r!aHXjy*e25+K4sM^jy0OV?nH$$C@M zwTAlo*T%Inr!tyi^t@Bcv?;3*jFV`BBj7hT&2)i~MA3iV?L5LLaA)3B*V+7xQ~2 z*lgqJ?rpm-@E|ub&PQvyj>|syP3?5P}IS;21Gpi!;R02TTxFEMkJv%Ii3_ z@*5^7C(VIhijR{hE{67d=ikgS!C)|fH%Yk0xWEZa;O$AMU`BT;$jqs)e~?yKRaM50 z3M!7`u=%NT7tj}g2M7(IZARY=GYZm8U_wNg5_0~aN;3~6K?mR2;M^JX2P_#NF1nz& zygEItWIMOv#0lz9@8kJs4!C|t0xz^vEEl}xwf&Y0{4&7>1qVY37XPf5^fQu!q`YTODD{8_Z?9RRW_imj%UYHmb62j$%ghV7{6(2uy^$sF=Zh!~| zA#0{ED@jBIn-Mi5*kEpEu`eX8=x}zFk0VaF2883LX<@wUx<%9EC$lN_Xa^<}8kjIa zN^$xEWgU&>bLY-qv;=9!3l}Y3wtV?Y6%5=F7_m}WMNLDKNOX9osimWqgawBFjnOY@06J-a^WDxbqybz*MMp63_dKAy$HgZ&F3LAFEHOZP?CAMB9UYu; zX2vhj$9M1Iv9e3d_wIM{3G#Eaaq!=+G)dXo-4XF0zTUp>uIpAR&X7^IKHwV~eIO$v z|JK8%n{_8jwi|B`JAW#~X2GJJm9Nhw#MMPd2JdmQHC#7eMNL;zW#yvz|7Ny-xO(k! z)2FW#uk~A7d+WDP??1n8xK)}~d+tVo_Mc;v6yZRS0uM}(Qc#qZ{J8G;o;$VKB@eggBZ#TmORwUWgQ;&);c)C`2L}Ah(iiT?h>b{(}XQ zot+#yS->RwXBOahnHqOxfr9^F0Zp(#2boE$FK z*N1{glt*|V=}2JU<#s+x1kF5NyTrauktpuFNEDDth#-agGZ7Sth#;Ul5yT`BBFO&@ z5vX($0sJ%Q3VPLsc&BYP@1%kw=^`o!4YKM+1slkfJs}lDh#G>Vf|!_(F;w)>D6i6R zLIsw4gSbh_nc0Ph4wqF{(&!Z!FJ_a_^~30YHf%Mxum2cj|C7}Na7|iUQ%yx>mAaOJ z!5Sk9g9Gvgmp{e_jCOyBF&M_GYMG-3+_tTg4?13u8*u`hb>?GsfROQLV#FZIJnBPw z10vWFPM{xtL%JA+HC;X|q11yOq)EFgV8@-LC-s1x zB;bN7QONJ!C6l4C_&s8LwvBr=H|EWKYe_C^JvNe z%#H&CgF<7{aXKR|w0TX1kTFJR^mUkG zK2=#MrCAzVJc4lb+}X-*`zkpprInWZ_Bz|__3&}BSTuQtob1d^eg{&+vx`nVK7FAM zUfngT-9sDi9@?@*Wl{Fa^SME%!XwjDeFD5pOfk1wzur(^-B9h~o2##1JUn|Sw&L8w z_wCxZMXcUNK z^hGEc^+tG^O@MQEhG?^)zAHwN34|dm9oRlWFE>TlCv;%QOcbLM!VtnC^CwpxvdcOZ zqv8;uV&sLhbzMgYYV+0i#1x78gt8-7Dtc6s2?9$HC4?YKis5Vbt00X+#6e$s^F5+% zvA6zj*hXOpk&H-mnYk5~4!nF|e=kC(FcrbS8J*h&SsAuD*>yFQ*bgW^Tz;(jM8lc$ zm#!jgid2nQX94*he z;pRp)h*uTV(sezfJOZ%`e7&8=Qp77Bzg@ySRiqomk-c`36&#zM-f>7g+x0$L1+Sit zDLZzAWsz1PzgE~Pc>Z9BUU4viCZ*>i@=UBy`dv6RqqRLO5k6J)n>qIG8;QY`S&z)RC-6Z#!~b8@xap{GpGN zO&|tJbGQadTGX^GG2m>++&Ob_xdUTnN?rmxKFDu)gB4&#zNZ{Q1Z8BX$^B*V!K8_k zCQq5OXz`-C|IP)}%|-99Xz40VePd$-O*KtDBjdH}%(iZ$xAq`snMBM$?lO5{wp>z) z{Dw{s>HlN~7>SxYe&Pn^l{r};Yku?YLrd$I*H_DvLW3h>qCv!z6 zM!Nl)b!O&!T@J(-)LprC4ls{^pYNnv9&ix00NeoJ7?a)rJ!FE zGaTu&wcTTGtUL>S3)o@w$l=3>{*8$j(~DQ{p1gkl;?BLNuU_7G@~(yV;Za?~ zi5o=)jTg>d4&aO&GeLSHctUm(46NfMFJi7x;%M*J+>ItWXU#-TBD3b8R*D()#M9mp zqi1&1Y+neHpc!#bcGP_1x1;7#&lhYO{D07d1fdDqSDu}I_=(N@8UtShY3fJE@FUitl(sAj+3GuUf#5ixHlmQrO*Rz8Nvt!V{ua0x1J5 zO&qHzJyd{X`9oz@ISGkm$GEBx$7|{WSeCfa-p;bb3uMLrjwR9(!4mn&V2NH{>s`4& zvxH+emN*EOC?qUVq%DAm-EG{wP1*10`L?&1EnvC;mgs{{B6WXIg}*Deb!Vyn>&s78b(WFQj*OSLuCRa91L>KGc3 z=m0}QWKDJ&c`&xc2Cga$v3xa3m9Ii6)2sRbZ&#|R<3P}c4$~eRRa91YAq<*~oS%JQ zhs+%G4!>{(lq7QCiHsdcGslOp#||CXMPcf$IGCcHyuU9H#m9eViFRxilXbK{c)mmw zLFTtKtV(^GZeBQ1niA~HUU3CQh(rITbvZh;)-X+Q1iNUk9LdDwtl!)@xDKsED>4c_ z(JY|+<;i_QBwJ5V0|1Pc8bD4|OO78mK}vqcf+dURGYdwb(wze_Wx3jFBV$8wsIHN* zvC&#A8vG!MzcFhDN!WX_$NPjNaq~7AgLG#J8eLEqg-OT~!ZHhQ`FFX67KFAsZKqlJm+6(vq@L!UxG+mFVXd^xK z#na?vWbhy=Vh%HXD(+&y%SFo%!afzez4D6FFw&Vi4R7>x{uEkiu%f)wn4yD*j**={ zfANx~%a*TFQD3M{xE!(nIKi@H5m~R9JA2mbd5giv>&$Q(%VM+MvKeyHlP1ChI|@_h zAp`pN>({s6fI%=P4aGfIR&Dw{Q&59=1DOE~-hSZ;dBu&sDM?|Wc1H6i%g9M9{5=I> zG!dbp{@dn^$B8egaa#L*Tx={Yb{J2Sl$$IqxpE)k#O$m$sLq=zHC1-OD6^1)f(v)* zFV}3`6#wfmHzh@9XlVHdp*lLGP^3RFx$;oS!I#&*6sFAmfJpje*5n2 z+xKr?ym|TH4lZ;xU4HQ4%i~*($1fD+ooGCBC9BV%aT6wiCy=NqCqHrIo&Q)eE^+?> z@~1E~_`qfXb#?+-Zgw^f7#{x?;^}|^zRt)ow%G6BA1yDz<@ntE;>sg=r+4M$Hslb1Pst8B z5g2%@y_E&{=REp5z}N5j(FSB6;2jd#-W+Kz+=G&3QJAT_0N;^a5K=OmtUMnmnyG zs4KnD^s1<<>a6Cei)pCQx|EJMEc>*k#Of7l$}d(@D|)O{RoB-SsBzSVeStXVIbfcC z_K83^-uNWz2m8OwJqeWVkcdbMG8rm}J$o*A&U%d=1L?^|8R96hP{3;rYI?qW&j-k!FZuqGz@;C2}qorI1vi=c$~45l$|0B4mpt@RTk-+-@JMI z@$=Vq0oD5Q;*sp6tdfed{LBp8x5>^-jSUOJyg4B)r?9xBC^sc0HZ{LAJ25^zKG+qv z#)HD+vW{G6dh-0);|EO_PM$db=+pCJ=S`UPn&_*ms6ymly=K!6%YD8vhfbot8PHI7 zxTqj2AtDe+zk8dR04>4vjb=OSJOV?IUksa&hlg)qXiREGQkc7)m8I1#3v=@=Ym{dz zqJffCm^yp9lDvW(sFKEPUIK=FjO+i9C(VH(C{+Rtf}#N3*I&}(hW^>7|L{pu<}F!{ zSu&hibGPomKxWG(Qxl`r8Y-k?TQFfJKaXu|HkmGxk(QU!^NtRWjP$l# zr>i_$UTM0rwXc_*)!rQ@8}$}XSDdxd(c8;@%XX7xE43C&$xWDO#LX^E{9&Ue$^zu!FoFej^sWB{`IjQW=hMzp5PaUV za!-p$?#W|89(T37)bZ^$0wVX&{#3vK`z|0qFQf~|f6Hix-UE>TQOLLd4&>QWt3N<~ zDL_6^1oD*t`5xTjy|r<4yjXEb7m)w#|EIT~kMGVs`^gaz+OOIFooF1;pWP|g$L8lzw##g*P|V3 zPd!|t^|oDL-nTog%C z=;#`(7U(ku{c+x!E$M-hy1F=Z$I%cL@&Xj{Jy)$zSJz!ls|z&5^(X6n-N2|aE813m zTh+EwLRG_1pDzM?BmuFi8pYx{nF}B;g1sUtgnSMe215b@xXVEhQhbsFe&6I;i2Nhl2Od&n7>pe^b}T)v z@7U3!Mvt4w+DI2NP`HPYJ0weCB3+}et)Z!7U}UJLqi*VI)9T=5XTzBmO{S-Rq{mUn7&OB{x zKD2L>$vOiqWp>W1s-a_Kx@D)WLr8Y@+4F->*O!+R=chykdb!$LT5Q{FwrL}^q1VQ( zR?dDQL4LH4lBb)CyH{XDQd)8}3{6n)_uJc9nySu)*%a(Jd){<;NI-J3(lF>sNlHp# z)FO^(4!%6CAfX6`rQ|sT^QFcN>D_z4h)L5HuF}+7yK%>!{qx*N(4f5FE`jU2g9%gb)vCgY_`R5xqRnmk4~prq>Vo$9ktf1W;UYPx;->XkEB_B-ZX zE2~&^BDMB*Vq{Ww`RU+-##C<|TQidlTkUMO)PH{Y;>EX?ws+6pJgBZ}`qD+?RX(FSsx8L{0CA@J>M>lg7mJhzsaD z+#?4rjKzBwe-!m@?sIwHOZwlVeRPSaq%RYd^ge#wOZr7X`{V*)NzbBvSg3s$w6Ekt zq&Y%L`V?;$%bj*Y)utI6!$QRdc|q)IfR{JrBN4LQN~r6*qi%^yD6h_~t*OA3zLK(| z)h8OyT_j=+L3yIpkP~Y}9ev%5a)^E_c-Qt`@LuqaddmRl;kK|{3>iZ)1@ zxpMK`>65j`Dp1hpDnQT=yR! zA8e80y?wiV-uGI*)?xY9c-F5^K>iOQ$QQL1h?QynQp%ey-Jfu^t@RNp5DQ12HL zL!kb#A!EP;uw&+H#kXT@`y)`w*2;3*7Na$~t2H$R2*d0NqrH|E#1CX+>h#~ZVdW|n z=r`&Z_(Cv8^f7}QA|#-m(d?mZxJ*TvTE$z*sEMnuUd_`G*Bd|o;VO=D>#CkBSE*_k z=ZAZFIu{y?-8_wL>}Q&kY}Z*RWAWR1XR z5Sb1`q+%1C@mEt>MXelwtAQ{tvQhg&0$^lcqVlKZdc!A=QXjbq^w@s596D>6$6?8s5@Uz_M9_qyw{rGwQ_L|d-S_LgCz#nbEn_+L?fBe+a%Hs?8yq1@@8Y)R| zTU~jWF4if`&B{tojERmqn2=dqdxaQivl8QzGLmB>!~9%f!145t$*!os_2fBAueVOu zoqfq~PPg8;ew~iWidAZwS{kaV>N;ySY_r(8*Y&{RlgugI%F?1-%obc6Y^-+gGT%y0 zd#_u!Ve`)YKA}jB@JEb{i>rr!cv4zQEY4eD?bF@WVbA(ibCjefjF+FYWXUWAX&J!3 z6xL*MCu9=zFNTelU5%lt#9MMgz%g9H72 zJY8%p%+}$dRbD)s4f#-tZ-`?WmloulFev0w>wFVpKPn|3_Zt}wE!-mbC zKV#`~6=kWZ^XE(Txg31$N=3!xvyG=O9l3TS z=zHHk#plxL*~&-ciLZ`H~*6()_a7sl;q@@Qq z4}$mfI~t`vS;bL80o6$WB1wnDj6t+NQGKM0)cLuEWfj?_+$@he*na#ysK5v9pMQq` zP=wc!iEdJST&}AK{+Zlf!MnJCf4eU5@3MTuZ{ff4H}JnK9q^AsPk?_?;P)brWnf@d z)?Zl>yTAdMv^jTj0RQ&mTjFPPg%oh08wKDD6DWY>3H9~%BovUE-dXKSL?(Us7^XqQs&NqqIH%6tpPqDT0a70M9p>6L%1P*dA# zwrP`KW9uen9ksFzAg`>ZslS@9!Dx!>k6+NS>aH@gs)w?wx&c1d75Gu^i=(nfio|oy zvkurrNhT=f>jJjq6+qD@$5!Y^J&A4p#R~}n{$v!7`&aOj5`iD!PXc!sRQbOGzW`(5 zPT)rtG)zG~*wv|y`-5&@JXxL*h9fJcYu6Z&>`U5UEU~t0liFV$k`KF02FEC_#flb; z?0Q-yrBi|3wEo#g0$WDOLLyhS*4wK($bA`qhX5Pp}t8~_^HPBX5)zUWx0jTJ# z+lqyOt)j8-a8}Vr)gO_XfB0C92>C%@t%x`hK-dR4{et_w*&pI&h&}w*IN1Ff(QzpE z3HXcSOgFEYemm&h2S`0_d_hOsmk+NVTt8JUIATDyB#ZL1(lc?dB=%r@a@L{R+fSd| zZpe)ZIlzsKxFbat3D1 zLD(e5X`}tS3>Qt8mzp3sW&ZNzbCs}Mrlcr6e(bn$W5!NEWOPrgo}mxmBUhV31HdT$ z4fL0l8arb6NXZ#14Y%%b@C=HGOJ10kniL;H^2Y-`9rl=S-MCIqec3#CkT6T0GGh*L zrY@W%H)$e4|1nr2z-AfTL0C8*fz2{7!0`4i=ufJC3bS9qApXzj?;954dtmZ3y7l8H zUh9|7U#=Z8Ro7iOY2s$;^OwR^7N0)9Z?Te^I9*b1=*^Z-E!neHS#2{}F?X4c=`Odh zNYCuE4R>!}dt4uW{@Udu1=p^esXcNf@$#99f@5V`saG#mctxib*Pe~eu06R|Zt#F% z6J@1WFE9S^^wHbTA8=;j{`KoHq`bg=oG(m3;OW$&o0qFk))ZIQ9%=gWw!m*{@17F> z{3|(e@)XJbr=DLytmLBy?|*0SDfWNG8bE0a!T?0=Aq?=@>hm75@)g)S#m#On7{J{M z3{aHIGC<`~o(|hCv+=l*PECYD3N3z%sAR`;1zK{XgUlx^f{0OV#qxOfw1FL6~P{k)2KI@AhIwI8_+ORxxgDNTuU@Gs+<@)dZGRBJv4G`9-w7ar6?qbcBF__DiTg$+P!6G;=LU<5*-9LoV@)u3O~)pIq65&|7| zlH_CBSaOZ9@W-JoqWzG$1xc7#j&tF#dBPG(rjAgg`G6)$cngu-Lj)Q0V!r}9peOdk zzARK`dR(sw6DP?`nY~~UXCbv<^!x=&)%1`bssVGTAv~hWE49~eBXqD`=mKKtU@Pb# zlF&hIgRl|!Kj;8dNW>liAp!m?v6rvJ(cO|pfYZ!>^DmKrK7aYv)*%qIx4e7(^#09D zr%%)zKX#-N$A@|yE-B1K(tZY=x+*<8udMNU(~XAwg9oq(5)|m;>Wp0Q8T&%{*D9l=-qP}9D z;$(#>Q{^xoC!>=Iv}8}j5+RwblMZM_N?{<3K+;o|>Tk362#knL&dgbumy?;Alz{!2 z@B`k?cGkPi&5U(OGayfrH>XUUF=y`VsWMn#167Y5Gn#A_kZl5_4gEvb3n*L_@5%;z z+)LyP=7SCBpV(joH|&77Ss(fK)~{b%zkF%sGvB^ONl%#g&sLgQP^rA|9MjG;az@IG zliS=OVA^#Stk}10xvaumWu47#@kvGJ8*e><)L7+n^v0!AHODR?%=P4jOC^UY>f^Pl z9@b@VPmivvIuTJ=d(u%!UQTi%LJDVOKYtFhZ}YP^Pp+N6a_d^d+4C5BvL=(#T!3bo=+v($JcN2I2P6>xY$!QTJR;CCk!2?ySkFT%i zPn2*ZEF``QB?xd@l~6*T1Xr(pJ8gyMUS5%vFh8O2zkl~m7(gNX6G|v|;qvmBe8tcp zm&iPBRPym!$U&t@W~@I;+5r+NAe8*cD+dM$mJr^*r#?_0zkcfYBmgNe?-}$2gcL~T zIyeF1Kdb$-HgaJ{P=_eGLwVWRxrdJ6R7Fr8^q{x`9Lssy{^4gvNa|#S1Ytu!7@;qj z?e0qnIJ$j@O&3N8TdwmnBc!n|&ttz~gk@la04nDT`hpKRR0!kS$JRMFH#6RNU1%s} z&TJmIX^X`UXBR_VKmU?aH@E6)egYW7lUc{CW!8w*2?^n$G=`q zEFq-Df)L(=5Qc;kK7fx0SEw)z&`>wP6titjKSLz4>FAIY2Do?V6%tqjQl-@dssaE# zX%Cnce`soN*=%OE>8qK9#Rhc^z80e;9pGW9D0+9 z@7=rD5g__dE5sI(NYu(snT5lF_WRTC-n??^Xb#Q??AT~Rx&z_XfF79)2tJSLq=5%ZF55I7Jy zsn?hjzj_HPGv`%rA|B!6*O++GZ~sBl@bPnNhk&94t?yqvLdekNbEg|gh&pw&2aeqy zEvHM>N|5u6oX@Q6(yHTSX^}zR9xg8Ko^Ea^^4$Y+>#yFp|KctFoKK%#J$>EQ@uu2( z~Zu7 z4i6`rYoQ^*+?e#dg4~qIKu_H8bFeYfm@|Fq)aeW0lrmnUxrl5WD9Xu9nuLKn9!{`@ z6zLr>l%df&bSVC%G;KO&!1FaX+4+RVB&BBN=8uGqi`$J*Tw}s_D|N}%DanVASHzYaIk|u4 zB%Jz`lN|GJ;)gdMnxB1n_WJ(yD_5^J)Yd+H_wB=8hfKdKzM&0Byg6P}dot=DaZZon z28ov$rfMyR=TlO9eN3gA`Fu-K|uT%=^xSy zyYvqZj*d`}3N?8FJr5O42xfaFGP+{$33_=-~#!m!$)G9X*x?6a-j#@v#uwf ztS&1)R9sp~4xOTZfY0-1vUvCI{d@WY{gL|A{#nq%Y3cY(eWE_nEN2KC2@z+AD1&4& zirR>iHAl;e^0TvZ3d(WR*}W!~o03p)^e7$py#0MAXGA2W*LEE07aJ{VB7~G7u`1y5 zJjyy+ST{E6tUu(y`)|*U?jCA$%jhan9ny{V2jl4KAR1gcXCTK;{>DreJ zU#w$6mMDcjAs-P@U}Jy~g;-bwUyFwo00CA2dTDFv>FVjKFXw6Zjo7%5z~^dZct5|X zd{S;#kNHe zd6*xgDIjA3(lco_CaWA8R>5P%~L zDTC2ikRvSw=^=$f<)+?+ma13#PPXwdTJIFEkh*BV*VH7(QhRS2J09ET0 zMQl<{f{AF7lsq)035yoOyod!eJ>#|dnyRWAx`u{2D$7^um~Kav-IXP_ZrN$yrHQyM z3QL3v#Ucy4eVXqX>ZziE_{_v^gOKS(sP`sAck8oUv zG{7-z zuRgUyocj9W`6q^cn7?cN#?2;cjZHRgwb%^-Y5V34CPuV@grU)Ti+;}Bs6a=2ZtEt~ zbtcrh#ipCKT0m&Bu&}as3yg?C=sJQ8qoU(8^NR{IV-9#?Ngc0S-YkTkXrhD_?3s%4D|dz*D?54Z`Qtm6tLqDL&Nd!Dd8PKm z;bRw0*QTC6mwQ_4@riOT=e&ZPm(>ZQ~XBujcl|!Mz3G0%=`0L#IC@wc4)t?G{)&91VS#~9**MM2#!+v6xoyWi|i1f_u z6K$DHsKsJW9`CvsyLDC?zkJ0{%#x6nL73&l@0i8VEV!1+?j4a{8;p#(U?+idejDBpLXC}iiA)4zg{?7?B4kXcMR5DkE%BRqaeQ2Z7Ypk~E!yVfTBVR$B3Lt2 zTC9j#B*G%p)dg&G!LZFm?-gpRwrsLARoCEYi$|Ew6KrPG7-dFRGFeC_WJ)aRmzYqT6a3B5djF2Gs` z5B4PV9iSHhVvGcjdVy3}hp>=UdVr5e*bzAAKG{$vO9r@;4&bHkeubdlf#4!g3TTG3 zEi{Zs$hZKN@a_*nbkB_owZ$nRF33A2tp;tt==TPX=(0RQtN%q-s$oN7n+@2IkY&X3 z2o?=k?vU?=d}}1u%cI!?f}2vLZ$ zP}R_0t*5K8YQ-vDkO{U7ezY9eU+zvOBufiz6CV;9X*not(Bag;eX>x`&ZWC`8_cU- zWK91I=iP-&0-wbjo3|hm)|f!??`o^>PsIl=B&Nz{p zsURcyU|687{(PmWGZ(6F+GX$V2wlv=&jD<2b>uc%k>1=JW%VOJxHTsmU#%evIbz64rwYAx^$JWI^Isx}- zl9Cb=5|T6X3JbF1f<5f^?Ag0#qsD@z>iVV@Hcp;Fp@B|j8uPJ=JY%XNG(cHG%_KaP zr4l~I)MAR*Lg+Vpx$z#a@VL}093jqPvZb>!(^5erana$y{@6lwbF#DCvR3>5QFaz^ zQRQ#cC(U*3PE>5MyD&g<28M1B5b0160SQS(U;qI@6c9v^5)iPv3+(Q0r6=ya@A=&s z5O>}G`@WxD3syfa=zQ;ap7WfuZ0_{Qh|?gSFZS~?5*+!vl_LNNnM={FVxy_Ayo4hy zeOvyMAshURr;b&eB>vp6Yn-O~5{>EizBVxFGKyTLuD)`av8820lb~gG7nveP+_Ghw zmd+AgG?dMnKY5Ope|BEwkrziE-?@6~XmRPe6Gu*;K7aIB^|gy<^KKj|y~VkCCC526 zt32;~W=39V?S|PSCXSsjX_~Ua+2$W#zJLAt{^iq`FHy&F>F}xR&wo7E4M{(9B`D_L zg~L@v2T$%_KWNM_?8JtT=&SIz*@Fh=%Xh?I-$7PIO;me^;O^|}X5llIA)RYiBr^IRFn{P(t-uIV6SAm{Ufji8Ar{*@+JJtA}K@4;v@`-NdAo>n+QX8XGs_$sFJCC zRHayXJRxp>$uEsUKys9fv?4cc_HtPp7=n5*aO5*ta!8^rTwQ(qgEvE>FfsC#r`GaC z`>Db)AwiF_&K^NYD(p>2gonH7KJFBx<1EQJ&u3PjFu(}?ldfy77dHs%#dY}p4~7K^ z^JN+V2^NR!u0vvJCFuyn>2&!###&|I$iDpt4i(-CJD0}K+_aS}IzG01Y6XdN_TFPy zbQGk<{zei-UHho0ni>IFc5LmsJ8@$sKYZ0Hdr$W^nv|xs(gf;TvhT>)LptgIMH6aa zw+Yj9bQUj~w_t(lGHpY%lR$;+!+Z4oXZK_aB(T`-)n13_t|1MWEG)uPC9p^@m*@~V zej=CVC~|pfcoP4rDX(Y1;R^KRl5CU(7*IXcl-Jeg@I){($*nOS(WvzbFrYN$bj+*- zdh%(jM`-=f{s?C)cmhJezS*7-qPL1~*ia+%$pa8V@S){3V1bY7^9EQ}8LYKmv-g37 z4jou;*-JuDP!(CLC>HR4=qVfk?D(vhN_TQ<0mI(1`~ z4@y#B;A>s8FLVO3OMMlT(Mk(XXE4wi#0zfwuwSrjz}a5=K@{^|4q%{P$-ZSp2B|LY^$BFCYZOut7(d=TzI&^-_7;7o z7h%Ko>!8Dx%U7=ATVR5|q5(jhK6(&ob}6x5%ar=`?>}Ucnvwn5P5ztsr(Xa3{2s3} z!gqIXzy99v?asku|5YZY_G?_-Jg^W$+}uWAA9r%?ZDeF(^%pSUv`~hYB2M zTR0*I6vnrJD3m&7liGQ_9OUI=@|6)E>f_?~R*Hg~0s@0QeEd-5NA(C4xhhxq59OB>LYhKup$NR$t>M>D0A2Tf@7Z3$KbF` zdC9o0uUcBZzWedv1FDD~-n#n|MRl(pocyt>FeLKs!Gx$wht5<~94k&9p*#_P;wC6h zRO-I$yMw%Go&Yg+$g&%SYh>hNKR}uhj+EJ0>?S6wz~A@c4&Tj9((vpNBt4sr$0qMN z!89fLCT;#Gd5h%xG(-C`9|z;t_(~$QNtj+4YITI98z8t`>J z4d&p_-1k}EzJC2e#0$|bEOUrEx?(ai78IGv^j>xhFq-`OP6aJ+OGLGfHp+_89>ZK z>Otefjs!qNoBYNfF=}|;qPqxqek=FxJ-k%($DWWSjhIwW&EH?$tGRytM(u6tE_1u% z&6=7UH}EfABXga;Dt85CvzOIzYIV45|DNf3dt@jHE@ZaF$?r39SjJ^2;OS{!%^I>bs(ZJQa z`bzZ`E42+Q)~qG}m48IiE{KOcC{qS9_R;y{cO`80ao+U-n(9V@9C{$ z)z_b>mB;$09xn{ub?)GSBj?JpRt_1hqC8qh$;5Pl3I;oWb2KT6&r`995bCCPkIHO$o* za0rzT40WoFuXSTFM6c))552?q)!Q-gSN@wrSs$cJnQv{frx}y8?_RQL zWk~s!a40Cm8?r}c2So;Fg#n_qf_3s){5I9&hqzl5b_5rD6V<~G&RSJZ`wKpWkYavz zfmHUCN;wpsfJ5!J+J~r(ghOdNC9+4RQdC6~5>=c?h|9@=@F{06`NAY5sz>=l=H_U3 zHyn2mY6hpMn zx0d%TiCzns7xITM=AjX&+y2B&zp;opA{%o=5XPi4ncWU-4$b6;dU&jHU*q7hkId3e zgGB`?|586Y_oSjrRH}ZMIn-Qw9zCC0z${c)Fn9E_#q@%X3l}X@*VdE5=;<9+|LjX+ zhh=HfVHv$dfIW=XFBnC{NMN+HG(ANMqekuTTJl^TmnYDd6EpmGyH_jGI?r_}9CAoFq`=Wbj;B~UAd`_1y#0&yMM!e8-hfLo zAdx&#Kh$$l_`tmAOb7+H7KT6sM%`F$5p~4wX3&lK2wV6^$o<1^9ua z_530Pj*>n&G(h87oKm5tbOMY3Cwxs!k)1k?o-R)oGpt0K+!-5zIWtu-<3U`9!uW|( zW-TBquLY_r^-WC;b+vW$P0ftBE0?J**EC)Q>F`fY^d}?%w`2;~4oR=ukR(q8x%hpj z4{u*UEWLd5b}YM`C);^ARK9$#!(v`o|LNs}nzD9K^vn!%Mk3UsiuZPJPW6_ft&mTHe*YY zm6el^qKbTQBu`~mLYTL`t&^LRovlxB-fsxKxK4Au)T{LH9tg6Jnj(?Okvo=;*Iz zA*yF8w9G8^XOHbvTi@8EKEqSoD5}smTQqOpdZ9>A`JqW%qs-HpHetGzYlxdR&tp?! zet7u4d){YnUO#j8@P0T?Pn{1XOAlnle1I3Z0AmzQLNcYBfrg(OK4 zkNL=kg_A(>n2$80fdBF8%cg(t0*Eg+S5v-5<(-yRQ!WR8wib3+Gr%M5?4L}jZP=T?Itv;_(h{*L>KK1 z-5TkFfg9Xtbku8Ho3L{@)@;lsjfb~@Mx{|6ZmAS>(S)=7{8LrXMKB7SzId&+bqdE` zn2<~zGK6D&Fh4Pa!&_hj=VJjz%rna9!a1@zNc?blXXw^fRx;$5vcYSQ_pEw9Jp8VGoD3HD0O z2n!?%NKsE8u2Mam5b_jE%#?I=>U2LLgO9>cEcUkoW#v2p0ejfuxt9)H~UCFc8S$-PDT?ERg^qBng5?G{T{X zB|x4ecZnVl64hhb@s3al?;tc1lB+zHM#v?9Jm}H=+KWevb|5yy&I(R369OWVaRqHe z>GmWcSMU*&B5HsLHnDabqEx!D6qF_7GKxu4Z z92e;>QJ%QK$gR#SDoqVUkwC!EUE zb$ipRwjIq#2#wvD@9@{4sVnA8nksVJpk50gn;P;byOE5WKkmfF^XdP{RfE@2#F9+ z-t9LM;SGxaMWVB1Q7oDMO`>|E3bGFpGabT{_c67}7G!q!M`JTT>)#-1VaIcF-lcng z>7vl+atVlpYg^V)#7K}8jBG+y4+RAmuLFZh3J8OmbDDESdu8)VX!g$KHwfiXG0ntH zP$Y#=82>j(w4OjHal4S;lE75cl}we0g%EZ@@#)k~nM1;I`7)T(1X0JLpopUOhoSL8 zdhqfJ4C;ni9|^H_cVXSlf{2ch5&o4YV@t~@7@V0(CV$-NDg-)!LNFDyQiy%v#^WPq zbHq>pLG<%y9Sb3wpzIM{69gODB8odB8>LP`asfDHGJqwXJu@uN#T5Q}% z1u*{jC$MLLzwdf?R~t)mrlO^F^%@JS+%)0NAL*TT`%Y0q65Qg&EUnZXe^sn*kTNrmO974Kwo4a7jCH}&~4$ohgf3tusSl;XL)68sHCm?K&qAGwKxXG zjFNBo(#ATC-dHf zAP)x{OQMuWbsjst!*7Jq?T45X5^ja@9ZYJoX24p2fssTgQ7VcOKv7efY0UH?D9ylH zi6k51&JL-3L?#hq!MKSk(`GMPsJd+VO0J2SAz2(@fn=zwwq)@#?f(}(!B)@&Izi)s zPTh$teEN*N_F?Hnee6mS3vu3pyXe=Dm@+SAU%w-j8H0&Ls&8&?`10xzWD&}N?>|6Y zAZZM|cUN?$Bhg7UH?Ci$uF#kNx_JI%b!kC%qMPcdL4E1ovwHPaUgoeNw)pnryO*l= zC2kB0^l@|dkIl|X&)B~+%+qnTPgqjY)&OS*M;Gt)8+^T7?9F*xJqrVKJBL-~L;|jW zdx8uob#(O+8DQez^Jf`wyBFQnnlTdZxhK6dAxoJ<%L z_T=P_*tfr^7{7FO`u6y3TQRx=n@E>lc+k4lrdkW9j)Q9LK$j8Y|Z^&EJJh*Ho6wR-Ln8nYWAAdM|gsP0{>~L5HfV z&(>TydFn`6Me(tt=MN(u>E@+F_w!2+-nzrt6Sr-DTH%)RFvJqa?+u7t`q$K@^Oj6( zs{8!#!}m8&pTBy1>*0%M4<0wJ%)L+r0gCwJKM6lV!hwTj8z*|y0YS@^V*Nh9zhNiw>GPLgSzU z$}6eLJQ`XGp%jqA;;FIabt|4q1GBSB4-!1>c51^@;U=m?<{TZ0V;PVBA=?THi%To3 z`3aCWr!zC*2HKgxPiG-T6w^L3zk|b>C?+YSVpDhgH>BnOQk~i$MO)sr=wfbW%){%1 zrh%ck(2OzbO3q2h0)@lT(xO(#UyvYbj|5R!e(e#ZW{;9rR_I1XM5QBiH+xUU-fW4W zN>2R2X@X2r)K=s0OaLkQ2x}z_?i#rtAU-z_c^C$Of z&Xw(oUhfQ-15r}6@i4rwO0*O?x?y7&)ez=NE;7kX4+A`01!AZtgKzO=YA04o;a#}Y z>^mMSC2W{rahL$ZF5J}P2)7n3Sh_+@+rZ3}r=zKj4m%Sbiiwu|n^UgD;y}iE`+uEe zwsDGvT|>$#^sVBB%idD|`NjR) zB$F=G2$d`=$ zMHT#S)F64%3@!qnKBM0Q}2xZ~4$|Fe6yQM)?qKfj6rSlbUAt%c~ zGZZHpM`vm3nR4{iZiv1xjW&xlROc_&UFhPvF~|pP6h7+JgLltz_Uy<^OWc`I6c`um$=~nqm}JmlvdY{|!k?es)PH*Y=;^bE zx9>lH{;>AurE}rkRC7W+%*)c}!~|{Mm3-)Ac1oJ7%#_Jv#!MdWRHv#ubZ}6ulu*K; zkHq3|kysp(+AI!#AQTJ@h-H@$O4w>~z*{8Wm+qD%j)oH_M9kkio{$nKUl<&kHv8_7 z0!p?v9>czH){`y&o_WbdU!dQ){~}bY9s4WBcsJd?xYHhlPd~gEZ`lk?pE@Jqodr}u z{yzX!6y7GELJ9%|TbLY)dLn#cDwu!cDQk~JJq_6x%N~VBhQXc{$!KOa7CHAaW)uhm#=T8|roQtDi3w zF!dv`Sqw_|I!c4Xz$s}ftq3kVQrb<{OL7k%u#h4{zbkEk8ia+@Bm4tN@(h`Xcds7H z-yY(%+SUU1K4RlRty+p4{6I-b?tPXlLS)P|8bFdqwFR6HjEX#Yp(KzJPo<%yWT#9b z>x?erCrzC`bLNaGaC{;E1Sg_6{~0+?Rb7K)WM+(uP+gv}5f86yOO`DEO-WH+{Rp7k z{Gw7?0R^mJpd%GhEeH?$o2ASX*hF8x0-``6SRLNK1I6Ec`1t28NVvG%?B(R_8}6e&S$Xn8 z-BqZVce6Ls*VVN!uySx(15cibiIt7DwXL14wW*;20%!DjmaajtC&Z*?=EApt8#Vko zyHn#LHf?|wGu2gFp=Ib8l9F3U#vm7N+(Gr>)2FwNrZ~=?JavY0uWtRuOqwM6HS5Eu zZ~B}iS~kAh(spH}r|ls5_J!Sx50qDwqYx2ADbZ1|^w5#YU=)(Yf_&Xt%$isLYvb?zO3?Xm9Z@J^2|kl*ded zTJYBpD6~k53DMeS ziH<1_C*hyObr2Mi69OHxyB#OwD@r!Do3gb8(?rL#fg(==iim%J!V{qIWR~EeegF4BjE)8 z=CsY%zzH&5tFLchIYBoITkx7L5VlZltYF|jVBo%H{Re+$1#w=tvZACa@nY<$6uy%U zAE-D|BW!umii!fJO2F^7F>Kx1a8yDkZAYzDxFDNJW*pd?elteO3C2Rcl@r8yke~1` zPGm;y1}EfC^JmYdXEAIqNZYn&{*2L+q}m0fFfg^CExTHn8S%Kf^+wu+>_mz!H(Q=LYMxcM(3rZnwE9X z(UF~ro&hy>TtLG>hx(N{1H%HaO>iND z)EVZD@O9IxM#NA;?x2;5W^aCQRf;4ULJQevIQS%F7K4?jlr6oq)n=g*%!s6AVrwJm_X>=C0Tad10gNKQw38* zDzd~Z$4r$&zXd&GFmkO>ngmZVUe;z3zczw$*`*L3yhqMif=7E3Qv+SnI|z-brH-Pd z|3pO=t7R_VxOtZ-5S;RmJY-A?9}0jAd4dc2Nk`yjuf`Pl2jJL25HkAaAH2!en1 z_}MVH6yAS;1N7^UhQ`L9?;hX2Avu@^AmKA4M#G1u_|V(~E--&14sLSbgJaQCN6HJc z;~nM<9nhy&kH32h7EOZy#SfgBa$h@W|Lq1eI-%-x}&}X=Lf=xOBvT zA7THt_#jCHsk!^`@v~R2AD+*3TcM&n65ctbv51QN&E@DrcRrqs^=7(gbSga>4?e9FD&`%KzVtaq=}+YI5#qS%hs5f=!g)1Z%6%w z6O~3Gum*Y1h=s#obTsB~g9l*Nh)q!c{sY8=WCsqQ&^`6D@7MOU5cUwar^RajO_AHQ z>_lQ}|5T2F4oA(CscX7FX=NzY!W>>{%`;tXq3`kIN6Xc*OLg_QrskaWKI>fUtgL-q zH-u*$J8%|Vrx(tgJA3-*1*A9}J6e9?=+&Fqc}E|XbM_Y|#&73uNefR749iU4?z!DH zV&J5>??3Aset!M%0*^UQAK$!ks$%z6OJ0Tj?y!Yp^tYHRj~F|6%2ExD)tllIGZyw! z9?>mHq&h%p?65Ed&0J^X?)cyNZ(MwilPxUzH!lS2+zSPAL{zNz0uVy8k|d&n*wkc; z`0U`TGy=d_F9F7m7yu(7`xvW56`ePSMEkf%11Mia|BzUvHwXKBNz;dg5p?7n{{uUH z+}-(E@PHhwNjp=GbqpHZBm=L1(n7L~X@v#TL^q3Cngt@EKp+M#ATk<>v|#Gy{ro|s z1$@(grbSH~EpqaT5AH8peU{JPYRf7MamzEnVwV8584sZBTz#=L8<^oL=$Wt3;nrj8FVdB_x3qSHBrwv; zI6+{MD}lwHXwHhZ{Y>X2q`dZbSY&SBncR7sXH&=f!e{Q?n{tj9q7x&gS5eTB>cc_>Ke4H~c@!2;w9sU#6UWu7!Y zMu+XAM^G3FEH6aJ_Z7lea19!R#)~cq6CeqePkOUv<);ttTs~H~BXWZaZd6Q6Xw%_r zX_jPN1Bn5r^-AIN7J+%?)f|@c476P^|l>h=AdpJ~|h62^8lP3We#6qBg z#*&dU7is7t!3TRWlo1+nwKde1Em2*eV}d%QRx4XOWszA>e)!}$f(sn?Jc0p&1}=#C zK>%X}2uDBZOkhE#Umu_?dVP5N3hOCiAAll${pR({XU~Vec=`I>Cqxq0H;aS~A0O9V zy>k7Q#KDP8BhFyiq_&3&m@wVBMc?E=U64Z`&;rqW6-C+Gtf#Zu;_qIgmO5?<+7!m$ zU3BQ;t%r~A-@JIJI5#shCnITFWT^kzHI@d3Zr01j4IegQ)NCCaS9d3C16_`Vp%nsX zob2sv?N_f^=IXS{+RAp7y}g5jI~FI=NxO1#b91t@cBQ2x#c$gZ9^h%Kw`|tf zK|Oo*AHBeIU2OJ&qo>baxN`IUqo=Rle|Y;K&t>6ArNIOG4_6+G^7sjZCc-a`o!DfR zsdJW_ctxe|0xdE!a{!C7F6CthiVODaOvb8)idFz8wr-_kCP(AoXT6KD>SQHoi}A`} z#E6ju7Nb~L^d=$2IQkq!#08E)>3{P=(1U8v3-7?lgl)?$=td@Ql%bg>Z|FOUu1nU? zT}ug=LtJ}{RclOj-CCNclYgr@I9S_RnQdO{ip)$i_mvyA7M#gK+}yQG$VCDNC zCyyMdDn54mT6*5q8wH&GyArmg^TU!uwnzE}ZQHkI&HAL(eQyfBeQ)^s1{u-#)IPa- za)0dRFfH!stuD@sN869{iG4bm#y$QT1<5u+}j$e3FU^d^&*%af?XMAQTBj0;+`uDDYMm z6wJ@r(is%FuaR7IN=8sHk>PI=l8eusJbbXYAU8L!l$4gA4bF73C9;BQdCGD^{^kC% zAR)g?LdO1LR2-HctgND}m_5`UCY9NUk&^|Y!mR#`33AN&`#NM_*bWIMsM&Jp?rbd^ zB!=d{7tFyQZat1RDcD}Lcsad7247^=)M-S2byHhz?!#kCq<9)roPVxSTxGANrK9sx z7v?XHyo05!yU0kv*kC(Lh`qZ6JAbBk*c)R(2thAq;5X~M#OmLKNX}~|#IEgr*-gAg zeFltB)WtT$+)!lH0f^Ak)7SsXt4ARfnKywFhB|sY$wFUW&(VnUiCZT%pfUQg9DM;7 zx@yGA_u4;!2Um!pmTLRzP_wn|1uOyB^mAO}-4g+^QAE^Ee~1ewMlgf!Sv=Cwpn zkmWupD5Rb-Pn({=c-97p`z;Ry>?U7;)d0pWKm`pE=9REGzF>2`-YLzi0LzD&z(DqEz+BaS1SYqkic{}%!s{g zDhr2&8iwZPMnp;&!|SX;YV-aG2bi{SA6Za#_ypj9tW^mdh&-a7Q#qg(3p1=9@y}qeM%%Iow*40awiMgNTE)g_5LEMf7ZpHAi0UT}< zDFHaZW`_IEGbawA;yl`P$^eX={{Fky7S0c$iz}t?yc& zrx<$MfEeU&Mn{Bh^7AlXHhF{+xIG%(gunx>+-npmJ4cQ&!Nb6Tg9i^8GKd~12ZNay z)2APj9+SR`ct7fH#XbJPh|q{F;epHTm_{a9W`VYvO)WzUzbTu{w-+=qhj~tp_AW+7 z9{4<*k}>r0uyb1D#rJY>bu!e{S6!P{QMtSN()HUnuUxr!`s9hcy*ZUdpjfZ z`i&H_CrRD0%`ZG~=MGQXu*5Yy3-2`+^*`TzuKWD@*~br1ijOZHN%ss);_969Q*~LY z?3X%CW$dK+V}^~NG)>jD@KV9TZe8sKh69x+j+&W&hA`q!QO4jyRe7tw>&qYb&~d~1 zjd6qzB6fQ&#`e5bM-;ZBLqvvPi>MV1ReUKL1nh-B6(V2APuWf+#PDsg>5{<82-ey4 zOG2yx8rH?ci@*li#Im}|=T-8R87vzPOPs|LHgwJj4JGIO?9%*sbe+Uj92SbPBF_6m z$ay~<*(t`M;)uV$8$XpUoOCwz_>t1$;saGjPqRz&UmD`qVnRA^YQ$cGX{K7lkPuBG z8C>;JQa&*3_I!5TPa-6wD~exukgU${-nm(W+?W%GD~j@SbMi`ZbNPYWw`Hc=Mbca4 zT54(tA1*>iKt-Hqu0loJU}~A0OqgIp7oSaQ94sx2O$<$~-dPu0(^efUEs)^EE+&de zS$ScWw$4A;kQc^34heB0S=f#X^ukW_Cr%nSVL38RD7_9`jwX&z&>AkU!?9d1GL++~ zDgA^6SVS1G%0q0VXl$gPaD>Q&(mgB$a$_CZL%`A}v`r?Yv0-G{JN5wrpHmf5cBgFK z(_+wodJ;kb1wgWOuHn37rM^~G(l0&r>TZ!3Gk`R$GVjw_>k&+}nhTWLI zmVLv5paD)V9LqeDA3Zb3<)S9Ue|zbR+?0YJboOj_w=VVSr?f5sg4FKtUm} zVPjY!3~R#xxdVnmcuFYt^d}&%?9&Owe72*Ureu=$N>a-TTT< zT)g?@!&s}Vo@oZ1^BKH4A{6a905eT;I`U|$9Dg9o@*?%=T8{gw?{WHpx@AObG26m zrW74Ja{(gh4$j@bQ6Dbs_Ef_h2uaZ6#!y)4kZ;G(H4OqGuc++c z!HNT&iuUDXrX?rF$I>w}+vwQIaj~&b30tCpvj88fWfRdSHWCE`L(wavOj5@P1p47c zo?K%N8bS|M7z~ZTiUeU_261By21{}nHc|a#`jb{eW{@HYDC^ZrgkGzr9&+7feyt_K zBjUnCb=EX}tNUL6ogfs-clNWM%K_Y+`1z20_QyhG^SCIe8mx#*wIl zp04F$hq%(Xgwt?$ojXxp$Gfj@Kfd|!?%SvLZywyb;OHNcX6aC?F~dt`Zc+rq&>&v0+|ZHZlqT!N z9OVz{aJ*J#obr%9_Ght{2>n;KJpn?|FCbiHR}o?lA#3<0f`I@b(H~}U(N^J3aYlO} zU-8Heq>?)XIa@Rvsj5YS&U5

`5#{bTPwBLDfifDz1(8yo+ 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

$K^nxQTR0AjAhf*`^u-D$fJ9{oBsOLhXRI) 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 ^BYU=y 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

c3c)&XwO@bc*%8HIoI1c92qJ4 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 q^WvlX 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

i4hg+5(Kol<;VHwO&PClH14Cp!8U&qZTh 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

#D;x7XJ03xHL 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�armitFAtX> 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≈bK|VIjcGjhPSj}5m^0E| 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�Y)h*KGFzfkv{Y$uD()6$>#~NcvVsHT_?7F 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

A{;gg3BPCuZKwyR@iO+=FY-7P0d=)7z$Dy10g& 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 z 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 ~ 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 !};4h-VW82zq-%>w(6tmD%B$=^3HX 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�~|u>7pYQ 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�R78u*O`38aSvS}*4ZXI(IQF)FE2 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

_&snONjDpl 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 z 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 z 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

fAuO2e>mKOp8}G$s)IIuD)r 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

Tb@cey( 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�z}df)c~~mK6x{uaaWaBSMBhbk%)fw;F5_|!3TbyBv}1M-4NoVf+}`lG?F|Z z^k6P-1Afp-w_9DfjP8okgFWc{0yPA6WEUl!0=2p(m6PDH-#2<6>i_(qhkhO(YJXln z^z-JSIi0ZZ^PLa<+;(#C!IK^;fBsMeyI>J{11Uk7)k6cFf8IWnem<{_K9NHrqsJjW zw1~&Zgc=$EM8ToQVG1sRpNa@z&3Sl%Mik-aL27?ameTn~OAS{0=h|ly(Z);^$s-%W zfGpwv;&}httyUUOA8wvk~iek?L(Iu(E3mfeZxcBSuW5t z@HbHP1!!G@Pr{W6Dh)z;W0x9{KlH>R{SK_c)a2S-hCCGYp*b0m^%ngCt(w?>bU}~U zfNnFmxit(8s-;H27A(XAuP&^6YD~$mm@(M<16T3zcfTkeo??fv{lEC0=M4J_`v$A9 ztA8>5MepHX*#30(fBTE_7Y{%Ei}dgs4y8}9_=^$G8hh^-%_Bd0_!0j+^6E*IiPBit^!$${XFo7nNKvS`kTt)XqG)f@@$Ew43jmc1(C= zPI)*l5hoKEQd72sUIIe?7ViQg~Hlk46s^*YC|Jd zsV>KcrDB;$^Vpup)CtyQ$TU&S24WJ@BTJlppyHHf?$SL@A96Xh$hQI0knh-Sk3H%i zE#c7u8$9;tqmMlnZC^arJenR$k4F5FwGWEWymFKgi7KmA9)cac3q-xCx!lwme_(xkH&7%u0$Wqjp8Z2zpV50Lq zhI2_kHz>OPqqJ+Z=`o~e85kG@lHA=Ke1}{nh;_9-oHZH2BjuHjhj8vaCVV=<>raYB1zbqak0!8Y%7o?3z+IVeCR&w=UjzLNdWXZJ+=#11WjKmLSFP!)zl{_2Uj9C8gx zoju_^;O4-1mUh}t@unxj;|1%`qmr1c7w<;^^^{m8+Px|FW)6kg#~Twborpq*l?d$T z^PZFd()+coc(Z(^iP~9`DN0Y2^n6i$Y4O>*B5z22FOaW_(&sZb;`9W1G(zu4>o#xG z!E*T3#m7tKN}whn%c*{;el^+~{SydX$~C=e5&_?eTun>V8f$GO2Evl#7lqqzmC?9t zbwUpszd$ zlt<%}3+^RUKiL;D5KIP2PMw7Lm6NoTDxPc!OONlPRh%=PCsCCQF;vQv00Y`wC?)v_ zE>P|4raL&(NVK&`f6Hpm1+gfA!ekhx)iETN@q<5Fn5-fcf{5`^pg#zwmRT#C_Ht&dQ~E-U08T>sgn)+##6ngpL+WIQ^nI~ zuo>21?L}+M{>`U0+37UF*08U!@19!Wsr=5X{o$tq&turPnD*ze8ryj4EYFjeYHVQ3 z*s-TnUEWo!dMZ8LJ`BC`6-yzO|@&rsl*gbg`ahENJ5 zEW(hUE}jurc;*i+qNsSpnjP9kXV6BO=y;|tf3OOw;*}DsNXM)ylFSx6M&&c7XL?Y# zdZJ;@NApIQPnTX#wUjBzrjC%eWJT3<%u=ORXEME}A*>nWSAz;DeTG$z^`4#Ed%L)f zN2~6d)JPt1m8TS*iOACc5e6D0H^t^(|S~&i=y$bXNVvw3;nH+;i7;lli?}R#xn!B-5C_(BNY==UsO5| z!<5(%yoNOsNwB`S?`OLSSvFEEpkY~vy0x{aNvWuRBuFAJdST-8#S1IX_g;AZg}`ox zY2CyW8DkTRj@WJ3PX1-{E1nF$@_he==byLqZ=Nq-cwRi~n7F>jrq~K5-}Lzb)t)#0 z+VdLRXE9MLDMpu)uVl>_;q-x{dM`$ zuj5PQuV0G4PA@Gf^lO8>6mb6~ZOzwZc|PFgrJrmCw{o0COg((@rM@6ND8ftW*F($g ziWP9|?5bJCUt7sef;i(#11qj<6X)9S1(Q3ksJ>BMOj*R5wpKMLAuaiRqz&q zhI3>JO0-GD4yh9HrER$ci_)E+wj>rVV@bFxwI@*fdqY$~?;!$NP`}b^^H}nexm2t| ziumJ8)|X)MrMaA;Ro@6Gp*N2XpR@RFswdOMN?Aft<2O>j5k-AO4CJL>*ZHFC{=Eaj zg}khDKvcHdz4TH;x{4THS|nH%e1ZcL8G+@?PA~UgdHLm6MlTnyj9*T#gqPzh8?2GD zZ0+UVD=)utKA&3F+V&@TjXsSHs?;+cQ&({ zLNqVyDb5P+I$Kf>ALXl-FjZbvLnf|hJUWrhQ!2#M<>@T$bz6t(;bjB4ToJ@A;^t)l zf`pgF*u1=Ccym#aA--bR@x>iGfBEVw?W?r@YVVa-UzxEBuclX~tc~p%g6$P;UhTi~ zszBTXMrI(k`D%PMzLIiAbWC`4NCM#I)gNi$%h_G8M3TiieRV+|i-%Wg&z!zGFth;C zMAezT#v|{#MUs`2juwmfB&L0JE|-(akr~ooRWl>QSPMF?T6IGkZLVLDBc|GF2R*4T zPeVi+g4aN}s;WlnnsyOe&HE@dIt^60;&8omX$%R^1@)#*O}4q|aSpdW&{vG5eYJi4 z($`*p{WY0B_II)x<6dZ-sDPjX7 z)GkAooZL!9$T$nWl@bJe9ejbM*Gd&th1RJ1!iCHla0|6V32s_y7eEHdQk$@O#reP$ zUSIHn9CZ@A70SF;S1!x5QGl#$401`DXuWryoYWizyUvT(hF(uYU|2+7o3fRBt7l_@ z$zYPPok$)!o5m%YC(Bjb?qgBRIw*|}RU*C4rpc1i>$6;w$R!56kYey{<`fGSw{-iU zkwzfCHlIOk)oGm_#Ox-+>pg(Eb1BdrYi5C!0V~@8wfU{{HqWel95gZK${TeCo?@N8F;w^sV-U*(8)M4VTEDT*a|LV6j4i$~ zAjOkZvZZ8VJ^sd=vAqEp0b7+S;(aBI--vG_c@u19dBvN{tSY+l#wMu1PBz8XO|MRs zH=&dhm>Q_wXxzCeEpNO@%N|hs2^+b_HzsfO-+b%MH)n69H`})$eyhhZvRktgb7LI| z^wyifm-yBIjE-R6s)-A~{??K(BIDbb*RtYUI|P^Ct$r)Kncf<@Gf=p;qS__fHSEG$ zI-g&3;=#tKS^i`@Tdh8pcSmJMG&6?)di7MX0FOh^U@wvl>^Hwj@1AFEu*q-Md5*Av)!1@AD|!N({6^0TQ*=u1x!?5Rcz2bf zl7b&+zbW7S&A|)jb8Jsys(SV}Q=T$adk+)W1e;m?HFi=a?D^j`@1gCz_--U1{QNM>P%T@=XNbfBf&Y|(WQo0H<3RZ73z1so~ zfK|I|zhd84jrP5{Trs}4sGWa=6^AM}-KZpBW<&!+sziF15rp?}pg}WHEm!KD#(d%; z085Jt*ExE!(n!haqL{rmln|fSz$OvUpPeG9)ww~uu$1_`?j0BKltGN_docc#am}vW7S#K zyq`W;d4K7Bf$TwU`e0^};)4nMODy0)Lx@J8@cz)V0*Ctj)~Zh}=t=~eBT?V_{l35o z%Vs99lPuX1BUbse*4dI8;NxNyQ)|up^X7$8$@Tlu618`LM5>T`q@tTb3$c5(c5{-q zy3mj(IxGOAn)e~xz{n=BYkCWIQn=3DzMnOWefIBnZF-ATWL86?L$+U6`XHHfi8iqa z<f#HduunwKBygj#^9ozVybo?+x)QMsS1_D6dZk+u;PPr7P4ZeEn8W#OewOl1w^3Y3W`vT z1ZhB-e49=_HaCPHP&Se4jcKpC7aDX)t!FtY(*rUF+7;5easkrSZcNdHV4Fp!k9r?} z^l|(secb=(_zx`zKvrj+!lrN9)S^Bj6?9=#J)Y5!beA<52;w?YLliZsz z3dYZd%KPlonviIW=TlPpqKmK<90tbSh_e2y{&YU0h_s*Wu)>xoRQN35OrLHuGUvlZ z3VZTIDIJCB>EVs!Xl*_%*h%G_>mY4GIrfo1m?{=@sELlJXS_cay%)(FH6TvUW1~Yd zEgF|af9feY&r0ziWlnp(u@i^D^w~~4=GMwLx}<1uxujD=v-#JK_Y@Nqt*D0k+0;;M zKcyNi@Ki%XM_azeq5CtCnE$|vcYMYu8AjULeGc;3Z^14O63xNxS}7X1j!E|lVf447 zK!C2v2vk`PS^DgEzb!t0`nQ4SgV@R6-oSJHw=sv8e9MEQ@;&ggwGeg z`26!PKL3Je_+o*bZNG@0_i)C~mn`Iv@Ok=T-Vi+E7k#D0&&w}Job#+N+Rs~D;fn;6 zxM1byUsRk5jBT*syt67Ze%|N6M(pYH!Wo+{W?4YO5x@AUmF>itV0pq94Oz7`M5~Do z1yPX|;SZlLdZPE3E>dh1h2;*U0zy9(5HkSIiRggP7wAwI%@>PaLu@{y=@*w8K>gy> z*E^H;f|(>VMD`9>CD+Riw2esJ3p8|w?9(*zAT?11`Dnm9eQN}A#xMSwm*4WZj7}1( zNhqi?XBhGP*ren{uuB~wkdPio`v`&wg(`v#V- zpwX+=yc2xMw!r`^9KIZg7f1TCM-3-PoLZ~^s{K&a1uDKQa=?KOr~wA6EHU!6oLlzH zVBZ#J(>2W;OpHrN?p8O2)bMHPXwlo(Ge~V^36SH z_oBQ0vZk7bp1uO~6}2&~=dfd6_4a*bo^?(E#5hL-YlTho`P^57eP4aGZ{O-yTq&mb z#aOY<$WO+os636G#N%r1q1YhM;`$+;$$Ct+Sg+}mA=Qpi(9RX~hyyY8L8>B_mzzvOi+ z)2e0`D?0ODTVpKp7#6m$(&eq&^fk$bY4t^+am25O-iSBr(=7H^q*a84LuX<;!PS0^ zVo|o;g!9Dc>B5CtaR2_PcOgor)de0H>_4!7{{biuAj~YV@5|e8thGI`zqJUrbpVig z;(@e(cmUXe17UxFpkSS{4&*dXaGC^(xRXJ=PTb!E6iLZE%83USwfMIMZ&Xl*1EnN# zB-mOlIhQ!0&FTq`INm90%?|YN#sfPXUg!y8#@ab3^l2F5)C085+%A%T7#|OHhdnL8f0FSvT zA7wY1f=KE{MPja?Mt{21z3I{H^igSNHV$O?)U9#@)ehT9hc%Ih;5XLVT$=q$#-+#p z182YKANb~*182S|4m4QA4q~fV{mnj};hS_|#(D_Ty6Fj@v3>rVHG(y}_M3QM%=*PQ zy#wEn;sotC8|;3-CfTDBA{mjl{EaBjW9Pm}2RFXG^x(JO>YEqss&9*f@!NUx9Q>AT z#EOFrR)0Ih1E|FraEvgm@!KBmcrbn2gCXbyCLQd9HqeYi`gSgtX)IkS;o!nnaa9pn z__j|L`9XYar6`yTog9`78jV)M(!o-pbg%%Jx02jAS>5q|Ygk3ZGx@eW2!2j7`AS#H zl!B-zT&<}Xc@4D%9`v_af{HBV&a_lEj0SIUa8WoxMXq}3AQRf^Ea(FG=%LjfKJj#L zMne7VzyRtDC3PO5rjzKP;+ekPZV=CQQ5vIa;=#VQ z&7nTegYnQ@jszm<(9li?TMp$RqEH-a4h}3?ao!K}rGq==6LaPc_~RjQ1F8-sDsVxE zxK{$TS8H)4EMh(K#9d_mLkGj5ZLU-t2M@Ie7i^;f@lelrZRI2>PSqZ=_B@4ZPOIKb zt3aNbmC==&GcQEkr%MYai`Rg4iR4a+jYKDPo=aKFCeMT(q`h=--jbL|pa3OJS2N0hcxWIYCNmzo#P;^^6d^T9b>WtDQ)mjDb*}

8A$mBzfbumt_(K}R}TI!R}bPA>PC{}i0U)1#JYx2R)n z+E`j$UeuzR3KCUH8(N(jjWjQFkmfQ0nbhTx&QLk}2s;D{#*We^-Do5Dw6ByXB1Os! z+g^!=8m0~857o{gpEU}CFD){$9S3n7P zJ(DR!P8=hk5UV-j#MMtqJyF}pat7KirYE8%?>R2U6Hqu^UbiJaZ zyTS|V3Q2Xmf|2nP(&mbcL?msm;M5VyYqO4cAy#rlPO3VRu+$Oa$gJ1|&c8Ba>HsoW0`5nvkI}+U)eDROXQAYm?KF4lBd?E80~`bncZY%H()u z9ozU9FX{^QpSiLOs~;SCLi<;~Dnz*}ldJrd!Btl}l)cJc>CsLQSK`7OsHpf#Nc<4! z1yxHt3q;Bc9WE9KAQkCXO%nlKNnfi4S2CbQvYHW#p+!j}dLAfpSq$YA#3%ZE>rGC2*&RdV#8bbePQ z>Fm;13WXs()YkcGH-A;WGNAjd>C2pIC9Y%3Npgt1I6d=X&aF@@az3Fqgr^T7jtJGE zM3|_O9}3-Kl+qU_sfw-&{_-kUfeY7Ra254Z2bH6SrCS3cw2Q)#SON}6TzggiFR!{v z_R>`X6Dc5-AzCr{AyMdsv^D>d7pIptl^U6%Fgw;)MCKu}kFWY?w2HsS7U-3y&Rt#M z3KWvNnyXVnJ5+M@W!GGN&F|3M0TALo!CakCY?1OcDbXOgG+?jsR|i4|2nU~X^T_~0 zhF2r)()N%hiYXbP&2xyq`V!5yVeB<26Jd;o9uSO>1PZQ0Wd>+4%j*=ZG=XbSV(F}`ye>gVCaJtgOra}GCDGYHMkigA1W^X| z*C^YfOutN2UR;6}krz-oJL!=A>MBOiQDY?~)DbIwATyD?2LBm<;O|i0L4S9VGcC1* z_^X6m_$x1jXTtQAlAf7gHV|$>8WAA{tN$z5zs_R_>zD-3pbO}4kXVvQ8+}>ySCFsi zCIn{mjeryp>7A&+Qzc;`OoQ1A6g+prP}YzZ2uMiVgqtnpVXG%1qm?W8(qC1ljArCp zL7tZx{5}O)@XNn0!9nJbGSY&GA0x^>_Dc=5Lbzoi$ZAq1rk}3;Is$>F9NC9cA_|nn+GRqj!qlnigB^_C6q+UcO zT?Q3ZgcBomI;-@>$PE7_GAlAi(u2vDItm#`V=Ki zX(L}LUmO8wy;irer~HeYE0q~FP$4hxcQ{vm)j$v7ZxMDCVP%mnjp-|H!IX2MCm?0O zvHv3f%5Ruhez5-EJOl9FemMSc27WjLKb(Od&cOd@XW)k`fFG`a z{=a?(>Q~7%O2RQQsr|$8hcocQ8TjE0{BQ<-I0HYNf&c%Wf#3d24@~&4Zk1F=2`3rP6Gss+RYR#|A&&_|u`&+z!B;FVOznecZ|0i8*k)N9X8TmK(JNs{VJ=v~-xwt18{s#f`YxD2^*{nK{>&h6vAUnwXk@;_?levP? z`e9gK>XG?KNcoj*3p4 z1DV~g&41)vTtn|)m_O&NU4#E;oPj^5&yOmvFK;g6wfx-tF+Kj)bTt2ke%;LfWd1is z9K^X8N~gYz*`3*SHN%+0K=LEZNW6al^N;2#M*ACcrTG(jcbR2-yPxD=gUyb|| z-3O5EMc1pCq5KT|nojal@vr|h{dXf)PW{(5KgCToQ{t(9N;q}Ol+si;rHFmm)G1Tb zeaaNV*p_H2Zi=63sq*NMlp}7`cT;jHSdxYWEjfynXe7Z-D3caxsVAP1qDa(K%}V1` zwA~a&D^XZPB2v<%6|vgBpiwimL8Bd}OlF%hIhDzi8GJH$#7!+WW}5mPxh0{6gxRP35Tc! zmQ2n}QYV;xQW4piEctTal!;QF`97c#0j7$$dLnkG_gu-i8v4Kvtj-Mb$ReE%!{rDP9ksUuF8DCvNj2~Yn)efvCq&OnrCRA%gqHeqyXUAv8 zjUP8I!W1_ee<|*G-Nj&<sQ6@5jaC9k38U<2W<+JhFG38ykIC&==>-x8PznKAkBe?{#h!iwrM#t#VC_9o)BQv8$ zjvQ4Q*>2RxQR%L(WO9-jiQz}(Bsp?aJhE0}gbBnXqLCrC8R>h^ zNRP!4H5cuXc0`EdM$i?w9pOeMBQ6n~)Tp*2a#}aSjBvxv2s_-3=rDZ52-!!np@t_T z{BS=aLL3qdN96%XRs!WpqJ0HU_u|u_p=&H#zV}|1aU+B&}c|Vu%yRmNJi2wRZSX8z^oin z8f=D~LJkdHIq1|tKd63SX3)SvgT5V@42lPuL2e+&0Ur)*d$fiP(#>F4`@ zk9d`A|9)(7zfAvr{Yc@0E(42^Qopcozy49bpnt!xU*Ep2pYLmtY`?z!`l(gGqfcMc z&-VQ>QR00xsb=3keO%v&bkfgIY$(b1Ni))hGV-QR(%1J1`u3?u5kxxl>6>n<`T|J$ zlmW&_IR!_3gFb!V?qhm4AdN`W$M?23aBz7<}I|+kZn@M+x|yym1hSfn@kAoTB2InR z)r0We+DSFLitSpRS{$9E*!0j%t4iH$*N{j|B@bekjT})lltz73iyE>29&PiQu=Q_!dsOuaP ztx^lmb@p{ZXH-xJ)O8MlF$JP==d5;$I-9y8lD5l9tTR1*T@%5x=vH*lxf7i_8A)_X zI#+e-+)0KaSc{=v=T3O0Q?aw_6ali>;(y&a(}{+a28m{Tr%=(pQw_Q^y*N09mpa?u zDQ}{nl(r&cI=6OW?wxW{)~R!`Q&#IGQ6dp*GB5pTD4t{-TABx)aLWWDqzO5W2%x9{ ziLd;-hII{ABP`Qg;q3>0IQek5d41PB$%(pLu>;(;r?2 zGM(%B1(DyhwqKa<_zn98X{`&o)bZ=huPv>+rYVeY-@=IICF)iV}2(K%iwrcHCD}gRuL3GjLGE*sc z3FNKHbS=`UVkWq*OUPSNNiE;CUf+`>BG5*JcOnW*mnMA+GhLd|Ir40-YewGBJ|kPt zJEgpVv&$Q7%p0h@U8ir^`j*ODZ2G1u@A|TfSF5JHOQ&zru3JW$$OnQ2z$Xsxyg@fU zEhOH(D4#N2^YXFMy(__>E1xyluJYO9y5@+nyKX-sEiq{-CYHX*^EuUlSoiMCQa*>e zrY*YBj}J#C1i=`JpxjX3SqA)bDm#oe+Bl@CafniLDXn|$1- zpStz>;m!xD=TkW+AGY#IET6sd3G4ZYHa)&WqV7o#)4dhpQltATNF$Q;414tKQS3>y zCsztwrf?O}ql_x_X{KcCN1K7=F()sCCsD9AWubvLe%SDpw86zp6S~9W|^XWyB>v;h)FV{y=SF6*UNa86;dUbaP~=f#UVZ4RmxQEU?;2bZz1eM_+FodNq&-)Pu8&Tm4_AwQ@|9ecD^RW><-*i)ftkhQ z0+@?a+lOn}J{j7H;tG{1w3nj3>;!xF?H%jDAwFORbX>DK&<;Q8d#PUARu0r_LWUEI z;i3vMq?_%l^B}^-vtAv$z9CTCS1zXIqB_I%bl;L*hX0{ll~=a5i*OBDF2IAn{V3Io zc)bpn1mKuTi6&_yxk%?)o?8bew+;RJmGm~Dz1%^hn<&>WFSiML!(jUd5(x2J|Ey%W zUvT|H)#=TJmHP)XfUX1RI-vgm?p4I(-lqR0+`ACbtv|7LlCFdXMBL7V_}tE5`vF0J zR8G?}KQScbx$kKdVEYC0^Kb-8E}D{rS;rmg@XqTE)L2J9yDlRd5{_0f+R>m zwIA%!t;lzS{2+@b5kEK>0>BUc$sme#lf#ffLk0~-yFq41qQK(dV9=0QO+)yy!9#`& z5+sA^KDcV|5ZwkxLvpF<2D>3(Rq}*ncSC9=sn8)6Ph1fs+l{#` z&T`*7l>1@1C(fxoEE;M__%un@4GV@2qY6pUR_~rYzT8;bVcZ`NCtDHj+=sd0WK{cM z!SG>`y4-SWsERxDVY0Dgpr%;dd6Se{xznds@A#A9!3Y)~va(d5%K~<|CCO5Uf@Cql z4zFf8LY5>(uxOAGEejAC)*@IykmU)(GKFQOLl#G5X1U{sOCCz85)WJXi2OH8abjZ!llIf@k{*0@+TvaCqiQU4C8tVOk{ z(Ui-2RV74~8QH@6)EL&h%$PDF>t=ab;2JZAY>lp+$!eJ_WsNE5f><+_ET+Yyn^|wO zth<$U{mqZfjTy^o9HF-5Iu_Jq)vlncbb?Nhcnk}QtOQcas-GQK!}?%l0Wl)jUY8Oj zpg}h_t5&4zhK4o5b^y{e2+OizFm{|DZ&{@DELyUJ7s6k@$JWr zr%pU%tjuG49-EM^WapNuyXisLisVympanhA~Ly=uBoIENoA#7|%X zEbSI2WMn}&VGY^iHc!awlCZ4q`iU_jAXa*@Q;{`cR(y47Tb8svlAEY2;BI2ONvu?- z+oXw(oSVdY_{518I7{vt@{@vzm{J)C$W6>?RVC?J3b$l`A`9)4X;xW^M`O83?O5!e zJW&?mCr_Rzi}-GGGKs%5uqMxdD!QmIA^tufi~cz&nS{xh2!FLex1X$k+Tbr2YS<~% zPH~f~r$|JCC4Bw{fyLh-RQNjvf36T){vweV7+L<>F;)J;(w;x=@VA||W0L+2hCh<< z$CiBhr<|!Vp8VNG{$7**2`2qh41ZF&)=hQS@`spf$zD74T01qzkxhc`+V*0nyXg4Z z%ha9vn;@}_cvkUV%Bh(eUF)W~Ys=I8wc)gDr`cZW|N>D)Y zw2XKb(@x8S7cZI?O$)A@=C1S8{B`j(bDf)(zi!$z*%|G+_S3FYk0YA`BEp&LEBTy+ z1sYs;y+c)Bp8}^{7hQ*a-SsN*b%tzSY<7E{zrKB%kt5sn&DYuMJs?SGC&BycLsBm7 zqews9Tpv$&*SqQd`UJa#xal!5iHmKnFH8@wpMHJw^z8N1r(X}MN;S5hVW!73+;lg? zPfuoKrq7r$GbZF_*y&|Wi5*OzS(M!LnRbSe{LIpfnwc{IPZ#ks90@n`(it;n&X_r4 z*34NP*$L(_X3ZpLW=WZy;b-P0KsKJ~W>l*sPzDiLIBUiXJ2Rw_n~|l}jG2C>n`J3? zGySY^<}AEmrUvZHnprbv&SEr>IG78``07#Jq9#4YO}_H+Vuui^?~Iq+%i->&Dsfjpl|DVi9*^=7t+@y2;*HbrZ#6 zMmJ`q&rMDdH4;vD%UF3FiAZT$?r(^0EZ*dA3<b zZpuj9&oMV8Dqd}e9nT4GnsZaDM#U=6$#I;+^yYXZd(#|jhb>YBhQ2v7=jNMlaW|V= z?9FCQf^L(>n=`k}xn)jK5Oe0Zo5Ne?%&|8Ib8d-m_TtXD`If@X!7VqtTMUxD`IcL6 zxjDHdyjhM0@wa-Q#aqm+@h$#le@iu)TW(>nTNRB?ZplcbL^>}CIwZF;5k$1RwT8$o zw~FAHTS^-A074=Scx5EMH6t)pio4a$HMhFC{?9e2*Z^UnG6ap%v+ws+e3wX~Wq8@s*p4=Q<$ zffGEHG|ox}`zI;-4yl)jy2LYg5^?i$ciuJsF2R|*%JUskEk65QcSZ9vD2B{Q=&rkx z`Tj1!CG$hv1}wS=*4<_1TjWAT#Fkiem!IE=c{BV8OzLjhJqMS$KXyW+83?H^O!3mId_- z&3zXThnzqx(z4Jm^!NFN`TG_wyzjpIiB+kEBd~a3wYc|lxZmBEEDQvZ+!vBgNGH@* zFT5|^$oTt$h4+<6lEm#bUNg?rK#ztt7c39-_ii^WVix(w} zgGEam5VNEV)Gf{tT)cRRU7W{Qw0Oyqgp^yHkS&xjm zw74W#x-400mbs<*WlNXJ?(kX>yVN69%LulG6G9QG^3sr?03~A4(b8bqa=XkdO_qgA zmo0b8JPE%v0}Nb5B3hQ!P6D#aa>SP}TUr$KQn$=dky(yuDJm{Ydo7Qac_hsNZ^2B| zHOu2=!SZE}s@!sE1Wf&K+4ALO;xur};^k&VBO>}d;?&NrSiXFP#w1rpqUB~~VTE7m zSA;89taK~P$_Bh(#mX|KBqWp|k&0j0vLap?u2{LEywa?&D}x7CxRsd|D_5e-ie}n4 z6|gGFcg{TIn9JEByn(N>uKFl@F|3`9QKVw@UN_F$urY5HJt8mEi*` zS0yR5AkIqrKzU_WN+?Yp$gFzcfmP)P%&HQSJm6O~t2V3L1L3MPQy}7yqDJBeN~idFrdRnWxsS zeafyiPbH}tugyy2slr()Kv)|qGGb^e)P-7^KuWF66Go++;j zQ4+W7vH~Mv6k9}>k!W4;%(|*|>({Saw|?C-c0IWD;zjG}l&sIJTThquZkD#5LYl2xZ#Ve$2~yk;uHUfUZ7}OkBP|;; z>o;uBq{np|awOT3jb?+}nBA~(;|8_M8>=^LWRrv4&`j1M(MG?)r>Ko?LpyS9yQXbh zgJ;b~_pIMo_3Xxt&&uXDdfbe-ZewNx5xX&ZHbY8r4!i|WBYNXYC3pPn=Q{%JM8#irycGI)ZZX%gNvNDfNk~Pm-#BItxy9tCN z<~R9gFWDrnMAE3QpahwbR#KDzc7U@WB@&|A8id*`cy^P24#;ztYkm)lH_&Cj*pyk)cO#J6mbX0^|4!6ZO9ZEd&2w9b-$ zj@H4J=i<#FP`5b?bjxN7Ovdxibs#E*TXX}l#cXz4yh>hz>~;&Y+mdXKHEuV1wBHhJ zW(JLdjNxPnzSUl9YXm z?h7>w8%0oGMR1Lw{5rE{Ptv9cI)=7TerJymu{5`*|%@kgLJLkPCz{NWUJd& zyLB6Ag=}|Q+eub))Y)x$NmA^#nXMt=(ssWs%Q%cq{}9Wm zsYm>FUYgFaiW%un`3|$)?r_^L*|B}Q>^t=6w)-8xcf{LcavqG^5o}je+z?#6J=j6i zZ@*MZbgR_6?KxbW?DIR=N;_(w-?8I)u{l!le0hg?KG~5Ie+Q0#KG^ZRMa4Vv1SD*C zWCZUNp4Cbw`uvXw?$olKfUut5>7MsHs<3uSq2P^%{PX#pIwVc~&L3CGc501`N`Yh8 zo%Z>R;Ns_lom2-qpU(gx<#zh#y^4E2D`gsCpmcLPFBMA@Zs)FDJ9qA~JN+&IyQn7|?%Ii!=SYfNunQzF4Ku5u1UQo< zW_NLXp}5Px;CAI-*!9A$T`yn-FYK}}lnI8oMF8Lq9qMRr2EcwzVM7k1N4vX{_J2GE^6FXM%bj9GdiOKdkyoHPP#UkItg+l_}dyCZZv z?Uwf3oxBiGu{(HScT9>F6uhvz{DP$4iAM)9lr_y3+s_B$d1bgzc{U)>+Q>h~wFX7<1O>i#Co;MM(Q zRQ#&h{|!?As(p>YUSojQ+^hN5US)gj)fW5`@mO=_)$(f@2|L_K#cNsonmthS+5z2O zJ#fIimQQWM=C$&H1fA35YwkdZ;SL0^z7`+Iz6Kb_RK&mL4~SIB*krWa9tdAgLH2-u zJw9MwZ$UfC&FkMHO_Y=m1h2oA954rx*S)|GL}>fE`0hZAB-jyRU(X(RoqUY#h__*+ z#=agNcpc=*H(K5_Z@rJ$H~m}9Xotkut#3wenS=JN%$si=eA8hjZ@Ghc?6=-L2&k+{ zf3PeCz|29xG-|XK%v%Q!zV#NnIphwuKXmZW!GnhmY2@G`doU!B91Pyl!$Ef_I%tqQ zQK>12B^7VkgY7C7;e&6L5BkIYQ0DNV!-w4A}QV|kyX)}Ms9mg5B#|a>A93%Px1)E=(Sz^!w-f9O*sbrlqvoBHN8LLYj{0{J>~9f!G`|n|U(eHzJpX7V*SxobOgqysVCn38dlDwA@Ga(^Z27TWk z?pWsiW5-a0j+u(CdjHt_?8n}Z30YE3bx6df_!5ES7-OYwp;GFOXO0~|e#{;B$NX_q z(N)KeA7ej$EGA@0In^N%o8n6ZlH<0`EmTTBIN?tgPneSyDPfCtYMYZ~e19T;@`P;I z`4cBko;Y>#MEPVURpyih;73HB3$&YvPq zAUJi}p7N*tDTjD$bGm%Wo-Ursoj!H?lqAjRgoIPjB@#*#817UCn>1JfyVD_VaQXv# z+J8WaiaTvSD4(_;5H6q2esKDO)0!|JB!Czc&?Uq^Ad~LybVdy6k(C(m5bZuRDvjv# z$hQ^0glUU zk~6`FXM(dImCt5AI{VQ_$yxJJ!&(24MHeI_8UK+#n-%jTN7!i^pNJ)6C<;FMxb%@n z%*W-Asy_bcBiTQ;xJ^hiB6j(sOFkwny8@Dr+$ZMa_>;`XpM3mrf>~1WAA5B96aR7c zlaD|7L@kLpA`#ktQY8gsC~%*ePvTEApM3i1Cry~8PyHtzT}Bf1HDxg)#D1FpR93Wsk$a&2=EcdznBKPGNUw-k$m&GsqmmUef z`0~r7V*4-5m$BOBOZ!Fe`ugjy%3ss_ z>yT)KWxl59YfB{f3eyv+Q5c7>h<8v&>Qb@N1+(VsZ@>Qf8`-~cU;A%zVtn&;`5PL1 z6XHZzhLrur5(!e2|GGwD9KI(0hw4aOD%wr#;M?z3ef#Zq=KIax`S1O??Dyxs|Nfl& z-ktN`n{(0k7VXX%B>esyagSsK5`Q0@QBZ|Kn2(9p=%(8v*G8#CgS8jXUI#;~cOA!*E3lAf}#sgaxq%9u@p zXl%l6GL5#$H)fg|Q#ae#glS2Y3A-lO7^8zGOfNNx#!WQq8*@_F*cdhYrl`59skw>0 zxyd%?L^n6JG=~_j*))}!vl3`Zu$vJ_h1Yn{(wwxI=D4M%xkWZP*p?he_3~+qkZE=; zzS$!diSd(`A1h3tsYrE8*wWhSS~9IItt|h`IfB2S}zc?EkSFG)v#+Ztr3zC zt|d>kO5AE%!q!3|YE25RHB)G9Mfrkl4GXP>3u*<0R;xkRYQUL7Lik6m0!^i&s)~hT zfxQ?Pd@(81U{!W?#1nukxEKu5xr zLjtbUBDz!r;>vl2luI^Z7$lB-IYB!WhxX-C#Xldpa-?}*4x=)*)cDv%**J=$$i+S~ zcs9=B#$|_XVjG3z;yyx;&?OrtL~RF- zR${Valr7znR_kz?5VqiBo39|f%{lAH0YgRZQar%;bdUsi9FZDzHOdSK1p;#}S7|^5 zQwy!P9Vimd6Gn4ZGWa%jwHyh1dec=@1`v=yM)BU`OP4fU#ER1)1Z3!u@t_=LqAs1# zX{GlOxj-9xLo8IN=TsU*E6ZAyl?wjk`2YL{k?+4wX3-mhla7#N{3#?Fy`lg33kXJj z1&PLALey~uWE_7EX~xwMc3f`$3aXF)6+(?)Qjv$Uql5Wh!2bzUD1QO{#+7slL3N&)5y?YM(wqMO9>icO zJJDeXbRvI2*B(TE231NwFh4Utr{e&syKx={lDiszFcc~>Ru3>;I4k`b>F*fhFQAS2 zW6nfR#_p!1BLj&4rB?T#j^|MDhf!6>S>s6<^KW@ALYMMyLHB^7ix`6%%{zZPuEBP<{+x?vQ z5TgA!XIF6cy7OwUp<6Hhz3R|;I{Y!O>7SVIf7TiQSI|Pb@<)iArT@e^{U^4osp!P^ z_y6o)?f3r`|8MyJ8gNDFrSR5<<%oVaeBdQ&?)tfOKz5@lxd5!VEGw5T#;CX;?~=GxBxiGaxvz zeEm5)h3`Z&pm41SJqnB}Qzl1zW13+l)}A~S^5tuG0r5p=r9u&xZ%{K=+Q`?hAxn|( zS5NkQ5xWYFBj3B0FIk6}@~!L$;ak~uQYJ0VS74HpZ*J$(aiU6B30JyKD)ZIxRwO~{ z^=stvRdO@2%=gDdC+XM81yY(6^TqKZlJclD^Hp+(lvVts1Z|Oe)o`y&kgV`sd5eFEeo0=T9OSF=j<{9I7Fbr~JM#sYQCgKnMTk?R zjeLt<*i_^j^d)HlSBkWdgS4>ZVr?P3DxR}`B;{)hX2r*sd zToDGAHW*!qQ=$wjS>;#Z+x<|aG$5&#rwC*hudIYA@@zqxZRQ~ac|L*hc}9Up3XVdA zQjdHzu9Zg(JXTSuQG_CeMv`5T`V% z-^v3P>Ejkch7zaGUkEpfB;;9*l8P{=n6XiX;>5~x9iy#21maYSALH}9hCcIA;(3pd zXF`NBg~vl+Oc@P9N<8{fG229f1&B==MhByWL}gSwy4@%^Q{-tAcAiM_JX50NC@8=n zjj*(kkpYGMqy^z&m(j73q_lZ9rAI02!!0nSj2qjNyLn5s%XcPI+^sz9W(L*59>twn2+H}9?Jth@+^?8JOm_<^jJh5 z04iw4j}#gbo-C5*iFmT8z>`GHm8XfEl9-f+SEbJ#jR43~LxALQqqc{WsJTp~-vZO)zOz1T1lHtR6PD&q^;(;li*Mjea zN1wnrM7U2RCeLmOe+iF?A(f}Nio$p@4BrfE(Wkq-KIK(TiBRNmuENkN;Y0z&6Johx zN_ZmAjtP-TRvtFf2glryygX^9o|2vv+qh4>K6+LL9agYKY@hl=zUTS1O+#7+*hMYsUAa3yYJd*c0@;;IbDl0b%R4D@o#REeaQ(_+Mvq*wOB;QApfxzHLNuLlL zX!=`RfCB&y00^%N4-{6UG_cH5f^L9CKqBz~d2-PAPmq)N4Fifi1<5mu{bJf?JS=q7ohwRi8R4^OS~z$?$2s?=9>0<0`KqAPprBehwc&h6c+ z#G|;ay@gT5_d17&Z`&AEfanvvDYMFXo*q7gH1afXORq?uJ2t&O@9BFrBaQmJvG3t} z3jYbuH}_0Z))Zk@5jK?`JzF&BdzMvO_*MiYyepYrkfR8RN)KU6!Scdt(j6d@5mJ<- zM|Dpyu%Yze;b}-z;4bM=+g(CDbltr>d@M#96Xii{B0QDtRCs>-A~8!l3S^gj_qfNU zsyU>)@Ur;swG~&CJj5*zbSsgIAt^K{h9|~<`|)riPq23bO5Aq~^{I3CO)5{FXXG(* zh+NXg%XxU7C(;F92`RG*Pt8}Jk*|_R<-4&}o|+eKl=R8@lqV&9_&zTXfbv+rJWnr7 zCxw)3MR-z#3MHp~sQs;uL052r^p@xJ%CaVk# zDf>!Pm(v0gDS?Vb#}#T8Ayf&3OhrjlVlt8~Yk5k)5~;70D@~Zf$O1>o#iF_{=ZGlH zMb!C{l$9dooPdYIbf#lxAz5MeXedPxp`Eb!<+?;;LY@JcMN(I-OcmmAR*)tkx9D7V zfohmcG?aESbSl|r93f|d4)ktufS+)0=-YLtOR zqet0Rp27Udq-YXTesuXoS~Ad>PSq&R1GGP8p;*Qqs8-WGfV7K*xh2{{Urr zrnD{6w=*m{5)%rSbezxm;Sp+<_Ym;>*m)>cjVoMN$^|iRX7hexmhfJSA%3{1c0SNj{yLO(&ofF!~Du zA4}&V@-^}u@;%TZzjyMR&M%L?9aMg6`JLhy5R#L+_Wb(G?|S78B7G;g$e1L*|8ZSA z#Z(Zsu9-5Sc!>~c1B(i_FgUfnlj!fdt*ffk@ixM{3~x|S!U%|WsIHIkUdTHK?~>^| z91ZpT5lSfH@x^yfc^4HNlrzLyyDIle(lyj~OnH;7ylZyt67lX!K!~mM-I$tg7rNF| zJ}n5A2}qCu5Z?afBccU|k0vF_DqQ?1fn9|U8F_;j+N=mntndE@Bpqdwz3sEd>t~33 z-gGO|<9*~Ck%sNR3`XB~q%9o;_A`9R!~X94UY* zTq~jzu9(V*#EZxU+vh|4mh^(I1my~BDRM0cOJC(0v5kc#W#DVooN%60 zE+ZI{idDJ)y<+?w; z7qF61giSO&{+;_;cm?frRAVO zU?X>`Ie4(G+^Y^5`c;MUq*ZTL2g^-rVMqwiid80*lm*4g zjq4EZkd+suR&H~-&y}Ma5^*C7-zOX=KBZEToEw@+l_7726!gA28J3lsXt+>>RWu`X zDt2fvY-kJIC=$bjloSZ9hE+*g?z#p0Bfa_7fP~~;oGGE@_C6V|JSlSTFI*}aG3>C* zgf~U#Q_@udj4pB zn6Qp9{5MP6{n;qBOszBXb~1NkP=cxiWO3oL{?hZ z(xsZxNZ3w<{$x}+rAdi&B?kiBkt5QC610dps=2bzBa1z;+Cq1mWzlJrE){uMBl^8n zBUxz52|##vv&xFntjsAM<`mBgl(48k)r*~l4@DNppa&k4s?oX>=9D(rv)JXvR7(z& z0Lu7Ymbk`1sKU~gtcDR_9Zpx*SV0>*8e$aN#+Z`Q7*oR%oh;1-V`(3Z!BSEc;9xz~ z($)!SvGA-2X)*jNW9bPC@|a|7weqhpgE8-o4dFrEAhz2~UzW>9`V;xcEYU;zXb-d1%rfOrD~ABzh2YimcJ6 ze?-WsH`z_`ll_z`fU@BVF}wVoAX3{+$ya)~$?ei+ilmKjuKxjl4VirLPaX2-mB~}} z?;2Cw)N1*IjO6$uicg~)z5cyLbOc8D>V?=u{`yfugz^OYS~AxrQ?u6!Nr@HB)=Es` z{MDwS{k5g3$+dLUSgi4CsgeEKcq+sw*ZOI#*P3Y;5YfrC8KEI*!TjvnU>XX#k7;d` zBgwSfb<<>X*O_Vdx^`-(+3S9rrX;y8BpOds;*#s8O^YwmmI#;tv?4-s0=dcc)z>K{ z3CHBRf1~6hLO>#0s?s#9Be0cByB@X@cU_`9Byq}LLMXoeN0laNkrrEE@QNVr`rLFF zNT%b2s5In-l?2-%q{(CE2(i2CgXwtw`ivyv>!B&3jYlWb{S1)^@zZm{K{8zfpb3~6 zZh9~S){+D>)=)+;2_ZjS&BFA&l9$Yw;e~5thMk#(abyPkBRM>F=tK}&pdlY2kr99+ z!~F^TA2BqVeu$!v2& zVRlXmX5;u-@$6vM?3Nq+Y>O0b$iYn_v?a6s4H+RdDH1&oO-ZC8DB(Equ!|IL^k~RQ zZoHvzV_s-YpeM0np>Mn)y3r9QEgUEimasXhBCVf_7y^iIs;zLDPz33So#So_=G9xgv`mMj+>K(bwub&GURTK=UmEg1azxp+L%wOHAUUcjc}NJOOrDCY|3Xc zr*QMBTl~%S$k#{+(Ma)@=vD(Mh>(6q#zRah+sqqb8k)NMwl5v3dY@< zPiwHm1L4$E!$2!?>8*2byKOF9A#-nqG33@;Zxfc0U@i)3khz)LNHffBI?!zz7ZQ?c zuv$Zh5X;TYr%i54=4PeW+>f9LX+$j2e4EGi=;(Gc?>ht1S9hbw`b?U8G`TU zK|L}rxjnc8mJVU;5cUs04>wU-k1D1AfX*Y<4A6?UXjic#w7nxE(6%O7WeKtKf;;aJ zCJ%FGd`EESyrhlr11gR?fhTt|n8xx#>H!OgCE_YkduLWc#B!qVq>m?+#k>PMxN|;8 zctFDWVww5Lof#~YnO`PBD;4p@4#}l3uR1NZ^O@Ux?G?b)F~3$QJ5qtlLkT>Zq3Ey` zN#OMmI|P)neWa`(cK)S819Gucct7TccLTbcg1ey(xjVu3cjfNB>u$oy-8FY%-KCCI zjK9m1cVKH%jAk8Ckr1S#%-lnld$M=mbN4-1;XQZXo!pb$4e7_-ISGkdBgwnfvG>#} zGW8r4wJA#T(n%!LUdcVb%`jr_O&}5pQcjWNo}BQDhy&Y*S}2R_fx$E4Q0-HQl$f$)ozkpw$IN57#RDG>_pRYXiikVVygLF2t{VYp!7LZKV+3oH^X%-~~Y7YHAT zT@Wl>;E3lI!d9|iVNwACTCgBq_!EiACfSSPsK_bD$bFRF2f>MIv(RD(_o1>vKysg5 zn7MC((3SvRh?OYV-j^Y}Fut#yfW(xY35fz6q9aI0N=R9C0#}KFp#+u@B*7M9l2*;7 zwosbDGE!EG5#<}Xe^G){zTd%1;umGf-oHo~NF+)hB(;UTq=27S#u6w?7Pl8JkP4H? zqQ#3+-jG_XG`MI{33`!WF-UqZPI*Wiws4WS#nk}Q`iL0RCQEY4AhIN03@r!*AdCHy z+QmXL(nd5Q7%xe;gceYWcwB>RmvjKA8wb(J5=SP#M9D;!!1S>MLJz#9c8P0qmSR%9 zG$--Yk(@}pG$zq5O^~Ba+QTo&h}W_V?hnX8%FEg>7v_;=?8-nAFZ+?WX-LDwlVvsV ziY#5OI0!?QIw@Zot7Vt^Wi8A7veI&BOOO~lyIhDt>~bhUmcj6`EFl&WYtl#wFBWS# zJRdQ<9&QEXAIo9XSOMS2ikg)xR=@>9WVv0@VLA4S17% zSGbi$B!pumTq(>TWF8Pkj||?5cx7&daC~40$49V&RJ#XOJOG9UPy-= z7YOVhD})IoYs(Mg}JCJx)R&`-jPV}l(?m-V7h+E~65LB#Q`!uOgV8vC%hx~)dL*auD zJqT$Bl6~+Y7(Jlqc+esak`Jrd@9`k*crb*)19Fasl84Ph_TlV95962c3-}2dA`ir= z?;fs|e7Zl>N~Ylv2tlCd_!iyzNbb=`9)08y7(mR!%>>Kn2I2E~r1eqr$Tvs>Vv+BV z+~beQW*>*k14$k?kGaP!^c^BjWA^dfV~-0+63OHF)WMd5R1$6AD3(TL;Ik;>jnTNS<_0 zRAW8)#A-YTvxs}LTHGgBlWu*|ug(c>^=kX1eZs6RKWPM{WsXw+WC++i8Lftl;&{J+r zPShFu3ujk`73r`9OgJ{6+N)C(SaO@8fDx`AFxhqX`Hwf3nDp|$R* zoT#TT{Mz6t!d0oys6f5O-BVd;P6TY%hUhX{@Yqk8wdJRSwa=8EPS#c{NePFw?rFa^ zMuhdG2ouUPP?gxHW8%SDB|{O`65mE*VxK+-FNuAoN+?QXE8x0{6rb_1n9vAcw8Vwk zBv!7I(;N!!yF>?A#Ouf476V#2)jsmeHM4a2D?5Z+CfWFTJH(hXjrQl9k?gyHpFP5 zDS_H!LzQxhKrP}nF7rUx(Qwd>tM(kGybpu!|?rl&jp(y>!^`fx(7nQ zAygV}a~V2~R&3EQXej%JkaV!CE#w{1mXLtkTq{8`o40J;THF!{Uxu(^_-!zGaLg)Y zhTE1CCJU%JH05Ea5MZ?sYCxH>6=)4v=r)7{!)?8!65hIH8=G)z7(_ZJ+dRY;etT9p zDYm)o!lkjzZqK3Akep8mE`-IRLbUmp1VN+&|?QUBP&xJ)pY_UDskyR=R zw<7~b#dfPq7SLs&qm5fv?j4;8o<-i8-6 z>#0s&5IP8CPieQ`a{(@eGCD#RkVfQ7e6!mMzrybFo(yCO6}7jtr%Jp%d-v=v?8!pE zuzPp3Cy$nB14U3SAWj$(_U()I`hCKTAan=O-YlWL`{KR9zP(OE!ikWPnBCi6SQ9jl z-b>aZQtbB`(4tlL`4?%YYzahP^!u_e?%Vg`i;-xyMDv!oe^K&T31THLR*Qwb56@~& zFz_+Fn3pKh`jUUS;U)8O3-T>;9zRBl_?JCi)k`nG^fLP^4mWzaTHRNOSbY0(_{z&K z#qckbHEW0%^~q4v^0IjaP6n72%zg)Nf_){s|CLwZO?V}QX2HFZ7mr=?Ma2l#lL_|2 zxB!*H{<6BzAqdI~7XyX+|KwGnNzg-TU|)=+=6?IC&@q&hf}vfCPcurl0B1vp>!4Wh zuLk=Sn~{$GHFE$ug#({MbZ`n?M#H6Wz`h27!D|h$8Nh4+qk(_Dh_(kZ!h}%3{PKW# z-5!9&;0^n_dn0)LjpX(08?V3q#v4UK5FEVWD!MIRz?Yn8`?`O_Ah|c+c;n4C-n4JH zH={Qaw0X0DIK;l;(Rs46m*2<;v{(T|Z4P)BET)6ZgAv~7?&MBLd%q# z;1FB{0)fMzq?nvA9UP(F98rD(d!!oTfs}~Az3q?qx7`tg__ssC!d@UcI$|{@d6BdV z!UAPD5I@CRr7?Ir^Y%M$zXQPm$9LYwe%rl6-8(QEApV_@uzNdE9ldQeCV7#xO6uR% zxUJyr+ZpNRj#j;M^qqH(BJQYvr$%hHci(x(9*y7eN6YU7M>XS*<`wwPI|(?CXu_r? z)KDoIq88o+_iokEci}%k+`Im0jo7*!weQA9{k!F(!MmFA@8%VF^e6-gB>d6ryGMml zA+4c^Qb~b_W8vuYupfN>UPdSl;5;~1MBMxCm_^5E|9-Vl9Y~sZ9xFw{Q=kZctVJt4 z=m4gK5~YH>03=#B@+j+fy=fMntQN{NsxNa-cV zWhm<3rybM><^}6UXp!$4(qSar{_BIA&DFIUzP-;wK!aMb)Dy>3sssx)LU`ij$>c-`yFuGgazd>jlnOP(E4w@42nbNpttT=PcPE0Aa4y(W zN~7RUWrQgq5jF+Ho@#dzq6FnifGz&>){O3&{z%>WnQTs{Mqo#*|YRND`XBB<}ADpXNf7jgD7|%&JfV7 zKMNzoS$`%uTMOjO*$+9KA(s8{tW4`{PC{pd_n~msf8>oC4#EK8KN3<0VSp%~ z4GFokj);gStDF!*6CqUsDiIcThtHJZ0h$K%NBs~E!o^bY!ATO_q+8{mGAFV-v@w_#+msf^O-;9-Fv#KPMxZ*>f5(p-|9NwLPlTh z7NvpL`3vpy(FJ$jU&zl_gDxl0KA)k8E;NZdLh0Q38YT2@pD)WaJMS)ZT|9sB{Dq6> z&*v9B$%t~5^TIedLIOfZUg@GV29u~?xLvg61jmbuyvQqSWz9Ii}-SX`?BxPk?2x>IqGj*F85!))SoH1Y*G>?M)f5E&@Bl_4jBmdhrHnfrzPL;0#OW+TWG34Du^A zvSjS~%WSVuBkJr*#ni%Vq*p!o3xB0~RdJy){FMe_`zlP0D+#Hblq5l9-MkuKxtd)o z4P3nn(cVhf?UK5aW7;AgJYlqPh;R(bHGzcN+YhJ>rgWW%aj?&6$}#O0~L~k z18$JY2L}eT0YB(Wax~FkN}OE}cBvF41~OAOi>$7}A-#qM8$;AEln+LPWog`CI^+lQ zp~%Epw$dTHQ2N0PqskC`4m5r+8qSAG!$U*qupa`^G31BaL*?P2VWLt)=P=2K*^Om; zOtPVPm=aR?p$zfErJ>=Wd^jE&_QPGq=K$Iv&_~-qAMAyA4)9|Lz(;il zio=f%j``8XSSrj$0Bekl`>|Gm(@4hMm?tgthR_+2;2NTCO!Q1DCcDYW3JsH9P&AQ1{0K%JV}-*r z`HZU@<0A#xkt1#vosYN0%9=b zqbgvCU?RTWLNQl0kcRIelt=`mBWflM-^8|g3r%U%3uFkujtnx0Y=r~K8#Rhx4lkrk zK-IuL1Qj7hmU1XyR1syV-mDQwA%I34yPy}S9cn@}b3-XBikc3wmtYcE$q8sAs$s~e zBvE6Eu#Sv0VSF@21_^KxY+96Wv5QuMC@y*ky@DH37Ena0j3VGeDC0<{WXCO{vQqMT zZK0;`t&N(R)N)gWWmT9{LCNZ!t@C%Nx890dFiK)UM`%$SGsL&ix)uZtqIt;eY5_3; zMS>pcNUKInuTHFuwJK1qh$XKQ8%I;roE5B-x`n>gXaf#OeA_1}Qf?^s01c5BI(J_kTk0Xy~}P=F(u;pmya|?Sbm0P8m?6im6Y7B+{$JU;Qrj5hi zX|q%9IL^75@+70IiNMm4sx2&zn?UlsMo;J$?ev^bk!dTa9GBmS|0$7c0nI6y4Y-_~ zs}_ee5P3KXloHT~&)Su&lxmiNusvwZLUnVzRq21ns!}Rfy@~BF$|nf51MMH;4{gv6 z6<2#|Y76fsIjL(v>zPKTK=cH-PsCk!#6Jt^#q!CJ6rnb=pvwaJD9iRj7>oYHSzxLj zWcWs!DoihmfV-MLkE3Gn#3qXvPfu?+9fKHni>)J zZVs&}-v9kcMDO$eO)R1}!KL|MVcq;2m^a%X+x#OaG<-3*gubc8jGKc{vF$&gm3fDDDl(Lzo)J@L-hG&$TvNtR>IE_gQ>}9h7`M{G)#hJ!u(q9!(MbxnfR?;2Vs%16eD1qMrW;{Gb0XmHC@lL?Zu$iSO;bb8Y&2m<7MLvCl&s@-`P< zGv71fEu_ti_gGLNWpzMA;D4fhni=1=S@B)PRC=>2YY$L>Y+k(z`7mpqdP4m{M;Vpc zXG(#E*olxrs_{ZmqG`2gVNuP!4|DUUWhf7TXb)5L_hi6(004nD!cPDYQ3pWOV}1e3 z2wnri5*4eS;z7WAr+d=9a|+)9Oj7eRXil6KdV(anfVvnRFG;qy};Uxw@l?s}mkh=JF&?k@!U8 z$P6-pq{x^Yu;fhD&DLD4%ppn+R#1dY+BjNiEo-Iag_RJd+p1VlLdq0_c$)>$wuH5> z#T}xA(TO~SqIla@Q)5l$_SQDM$hK|YN;zc(WsYwbeq*EP@GIN8t!}iUmT`*!CRv>k z_4;isN+gz>k?RUSGg*?mg}s`HP?QtzGG{jY*)sgtSV>&T1{OHZk@Q=u#xUBN$TN;b z!i6)k1;kr8&`$d#|6$pzomo+URaBqwaUdg;_Wu~D2^MQlClrw#3I@p7ptC= zg)?2T&N-{LZ%zRc2~w1cNJMU(v|I#p!YcS9bV3}-JrHhDzNsoA(x%M`McgJ)kl5cQ z?C~8`cC`5%)-2_2@fPt=d9-;zMP-D$;$`4P3671^cbDa$IBi^`z&Bz=d9q^Gjo;WI z6y1Fde@Xl-@sX_KbtxG`6U*0PHIgGu($nkXb?XN~5)C2WS{L87ZWL!#hs+dVR)nK>8Ldc3nM~sv zo8nKKn3#Vqv6g&c?^;XQwZaw=#U2r|C|cV_h5->xt#xYzDQY33Ys+i!*3F2DQ#3=E zuEBd5>5z(s3b$a9il)sy*x%V$O1lk#euidPFQB%sh3H(6H^F^d#W&HGrup~6QR zPieu1(mO>iiYVuamse8{>QzltEkq{D26seuiEMnWR|!6pAlHx-8AYTYv$XuI$Ds^0 zkoGFSaugXy1SgtWRav=;*ErtkAD4IfifpA@QGqG6a%H}vCP#L>+1q%iyOr^ZUb(K% zATk_XnXbT%os7l`-`kJKk^VWt`if?+Uy<~dR^Tb$TVB!IyW&ExTag=&2;X-?Cm(zq z^|R%I3_%rg1XX1ND}G z5u_@)Y&n#HqyP&E3gDJiP>MPr+#y2=g~Uu@3<+g1Boqn-gF(WS3S6fgwJnSnK}`u@6(NR53Z4?kL)8FZNf*_O zFC>4V!Y%FE5>et;$yapT7{x93xx>`nP|}%yAm!YT__~b zoCOOP0H_gjDD9LD;2YMGqQw(tq3a7cGQQ}3@mvLVJs=d^Ojj7c_|}fD$fAU<9v*`LDAH9b z#O-oKo(dY|46B-5OcvW-r?8tMPx-*q+5{7*6eha*(U8Tue2UGME-vfxh$+|2jH{_% zGEZo>AO!4`>#P|mN`p}WDw2UnZ#6}EKMU4q1i2cpMqHSUL*$miKPoQjfk4N95nb*x zuJ@j-0Hjma%+m5=vcmt8@Nb}pe@A*RU9y-ufZ0{_kBX9iL#5G@;qVVCv;Q(-KLsSu z=^xILWk|G4;JzvTr3%zHvb3iEqWpWDAZ7m>Nl)v4Brj-r%a%TG|9=DAkN>FA(is$& zK?^O_eLyU3q5iu^%f<#YS_ZiKo+uI1?_ z#`OkrW2&2>UhaxSeT1EaRCVLkyCMsBV58`AB(uJSx)P&aus)w#E4HZ_6 zO03aW>`};$-KZA`8D&! zBnlS776BguWz-09sl?+j- zT4piNRA}v;t*a8V%!);#^;D*xsX&s}=j-D2>oNeketi`d(zCj88wFobcmX@pRcGYlYI zrcr@SK#&ANDgiTcLKkgr6Xr#l@c~99u(zzc6T+&>$W{Xrj29@0QKt?c=tk-0E*rnF zF^ekWB%~a;W=1glCPrEa8Go>FPRDSwVA70SFa#3vbBY9ehE@C)a7YZfXn=(wlQ8-s zB$7s7Y}iF~X${;kXj3qfL{j4I7||)KFylgIlcQ2CC3GOHx0VFUAtf{F=)tupZG^5 zphg-D94H0>n}nhyd1D_jK3IW$v|~qGp(sc@OQ6%8jXyFlDVloDa3e#S76->}ai#sv zbVmg+($1Y3HcD&Aa*mPLcY;r{vCEwCP)0==9ZeYr-66cY5boF$D&D;d(_OoeeCKV9 zlWH7P1FROsLJ)WjsLqqhlmt6e((TH2F$~P`>@>r<*{*6ByJh^<#&quyUdin$%R&^U z6urNm%uv;leAhUG&6CJW3^w=Q^P_!?)eC|&E2hvUV34vt&!{+q&3(Ha(Vjlc&3gCl z4E5g*1*KJnZGwTLf*+k7=MTgAVW{7R{#_pf?|ZVod{20C5Qp^&qCG4sfU3kpgsiWk z0()HFJRS}xX74_prH~^AQ@-c*duN$U((KWjjJFVfm0h;c`%K>OaV1NRzt=>V3( zIoa!8Qqh6zUI&W_5R-UJ?f~XgjmD#K2YyVJ2kvEC6uBO^(oI7)1yB>)P6PlGiR3_8 zA(h^Dz};6Cl?m?CebkQ5-S=Zs$Utu^FdHX7x(^0Z<9^H$I8687*Crxy_m_of0baiP)S%E&yFQUDk4t+CFQlr%Z^ux9Y2OTK1RA^(Js@W z_s6?MKoSWFG?G8w0_U4a%8#VJ*GD;sr*F63~3ET9V{kC@#us<(Jcm( zNK7Z(Nq?esGCy&P(&0_sN%SzA99b}%OmA9J`N@hI(i)07pi7S8(aFXse>y!?I(_Q& zB(d+DicYsrl~12Kg%X0&DR;Vh3g*%o67i`s4WlUanC3J^PM>O>&QG;Zmrk9=0LwF! zbf?S8XVPzC0!IpAVFq<9%SoDwpMk!$m2k8;eM~|Q&;h`3F z@(HQJ7)a4WZ7TyaNz|n5VJJ-kDUm2cKzg`tz$1$$L|X_TqlYsK{loDi54VX*+#~Mc zIU*`O{K&&>*~KFjqK}Ac^p=@N%iO~18fk+)iw*hVr*-ddJ6Cz_-3rUFQmKURDEvBw^N?D5Cj zkNL+NAcw zzX}S-0Rj>xs0I~C?~qb)_pY|#fBd_Kf2{=5r~YfDcmEpXA0dIFcQt;^1!T~#y({^( z%DZ3y5#|M%$3ftM$MYWdZvUR_-I`ABWBN#4eb0OKa__0U_dP`1d*{B7q`gVz@14(9 z2E4V&-dlm_BP>w#{?_|M?1|n#B|?u-J?|eta{*2MzQEcMkq1uC2R!thjL^M*uAn2C<4<9^+n_+QTn%K&tUY9 zsej1*hW`*XA^C?&zwser(Qjm=GNs6^eF)`;J_LJ5xryZ{HzJ-r5q;P_aqEYlc;Z7J zV)Nk-Kk?xwh~yuRpFrVo=8cT{^Jwq1>;fLS$vFm`#*|?BN9#td`|k2Ill=lN5GtqpvuWgKa!H2i?LH= zWxtuAZ+@gALu~wS#vl1jFgze}vOv*EiRQmm`$(YZOiTG&6Q3 zZT?R5+ZPbRk3Rc5{&(AeXY!9mzuQ12ktQ;XWF|0V2wNYGfA3@M--|w$ApmDS_7_D6 zT;^k~-xDgPYK)kVw;{(gNoIti$kY+RV)6no(;zO0O#CqbGbKna+3)ul;pG!BTZDB9 z_?A!P09@t-_6s@abIbF;AAf?VC@(_0gi!Hr6*v2KfW&+fpi2g~rTt0ZFrS3j0^%iw z0@FmYPnIkK-Qh{CmApO*Q z8Azk8)E@pz4hP14D*gkK&Ppj+4R&3h{>-O7BR)$GhNbeEPmxfpOS~1ZE1!0s0prsC zwExUp5}zhl+fQeoq25nNpUKJhpBC8VQ~om!tNhb*ijq{>0kuqmRdN3bBFkr|iM5d& znK8}qe=5UeA=`Zxa0&pG=4a>q;b(7nH3Ey}v!4wR6;cUe)@&8?e;9uj_KJtJ;>2m8 z8h9%1^Nr6%pU;p{Bt>RE=Re;<91?$yEDIbtCV!NF!GT0c5HIM-=Rfb@n&c!(Uw~m^ zsFTm9*vvCX3LDg4_(G1o%2}B&5CxOs(7G>FjHQx8I~o0B_ebM|FC$``)c-jC6R;*F zFeNE4lMHcx;{VhW=17w`Gf)}QzQy`Xj8F6o=PBzWMB5PA{xBILK$dbq>bHi--UngMU^QVXt4+yl9!0y^xa?R?WYxeD^!w{qA?t z@A~h6tN0F33yY)u&Ue29>f$@?@0N(Q$>mD*y~$$ z`8lx}TCYaure5tn_o`m6o;x@AYId%TZUS+ydL%lRBHs7~{yf}(^EvVSLVO;4L3ANK z??52L7YLLq%0WU{0%9O^LKTn#FLypw0dW%?mPR`$89hMwgTNh#F1kw+K?5om1Q&3| zA^=o?rMuJx1VO9F~8H;xr zbAU~LxfaL-m+Fcch@g478e-G^6`cCzcdzg=VXTdO`lBmN^Zl3qe~)kgn91i~lmNW= zF_&G6U7IlY-n*-K<6m`GYFBZ}Czf52pT4^)fBozV-t~lzP-$7_#Nh@YB}%v}Rh3h* z_^SExt7LQ)XLxhtPw=geuaR`uq;z=Q=ZfLkkLUfhSwDMx?(yu$abL=TtLe4*L~;H% zSAX-w_vWP^;c{OZ7#x(tJ+AzNxcd)Mt#ri98K0CJDC3lmQ9Nj#_qPrPFMKKGwr?i* z?GL0>kRbTHyP@i^yz&S0p?Hv#lWRQA`8d+c%f5S%UrQ zdCP1NP2qU&t5-A|aZ2JaPecldFC6QK$yNz-sCOgzaEXFxVWfCI z(q%<)!gr(5SaZ~mC4`FS7W%OP!pYI{*yyOK$48^_`j{Ud9gD`>NQ#_C#>Q}YAI~Q8 z@qEIMmnZOycN0~%6XR&o@e-k%h{rKfCUzAx3gtZS&7Izj-zuHnR*smTXyVK+U-}g1 zc6q($lO;m=)62iUCLM2i+2bNVQ7^3X$+FaPr+4yypKc>91b241xKB4MtjgVdYC6G- z-J1dzFv8Xp9__fs%e+QRM%SjxGt<-Ne}3I7J(?LW{Ltl-o=@X`jc2%@nOmR1&0C({ zY;SfIcSR;SdbR3R3(ax7gvQ}s?q|HYm@AYUxm?bP!-!K)h|Z&xp2l{U)CqYaj2*`(w&?i=QVj#2Qn?!s|f&f5+AqZ{3=kdmKviD-^i zPS`Y}khIy;XvuS%61Y#BJ~QWSeC!CL!V`L)d0NZc8fj(CZn@(UL@v824y*F3ZJR?YzPm2PceU`}C8~m1>Z}fV-Qr_xahb^5 z7pKasmS^%W&9TCU!@?ONA4tVjp`uDl z%p8q!bN@fWA@cvtI->};z=+<3zc-vF{OAAnO$(RYecydjDgMg~58Oj^-i>xRZT3y+>VprC!!BW`=URI-W7c$dN{f#Iv#yC`t9hCqYvOV_*lg1;n96K3~pun z5EgGkyMgpC;dr<+I>YN1kxxf|8cjy;j~=JoBhkg^w@9~meJuLxD3AYE{J%tL^n39? zkG>LpIKCskJ^GJW{C4zg^tpIGI#7YpTcXcJ?f9QYFULOD1T^mNpSz8GDJ=f*wpKZ|eU&gfRkUX7lM=SJtFB>sn#To!#kj-qczKKf47Pc3Vs z-(=ri@$2Gwk&8wt_ao7Z@!yR;9p4%aQ0j}(OVLxbxkdcR_-{q+=mlzD5Pd!V*YUrM z#;L8F+Na{~s1^Tw{NwR2M_-60;vbKu8d~`cKiI!2-wIgkDkEqoE{Z$&R~p1dh8)2BxK3)K6y_?M_{5qOZ(L$u%$=fWWU z`E!m;lXl!0FQ&HVIBWi;TF!a(3-tKsqW<_Fpnr*$KNa^-`81IT^fKS}Y5&Aag z+#5JzGD;&$`qYF_Uor^wdXY>;s!}oEXT;Oc` zC(#i;{ngQK0G=QuzAEcz7Z%m<>wd`h21vz4=U1L^yz z^)NN;=Ir@>&Y3>G1&eSwW<@Ak@{c)_Kgv0FkrsT7v*qJ_6P}NLBYIE#i|q3yt}TOn zKmQB04f2hC14s5>(eg{twfOJzImfhZgzw;U9J`<6)71CtzeHo42R)n(|Bh?H1Mv^@ zt*CQs&hfo|9ea9?BR0($@H{5&L+wha-J}PwXFa%s27P-5DL^wT~;# zzs7a@x3KEt_yHiwBkMtGI>E_@EdVtOZEy|~P zVtg8izy_fEtAPY-&s$0X)DybpGj-n?Q))xWCfqW^+Er3%-3%yc=)y zxj4DYBOVRwJ8D5k1b=n&a+kZhyx=L*QOOD3p)OG>zbC_8UWGSXqx_zEvnQ{n^xb^+ z`r_=Jr!(B<`ziRIvsb(V;S(r)W6R^w&GN6u*M8RzF@>_@{T}?_@z%#jzDG(;q~x9L z>b6OjO5oMMYp#_Ec_`#k&%%`96&epC0nEbeS7MSc!w~5vq2giY;f@>5tjg$SCVS$$ zZ!YxAIpsz^*>wvk%>mUkP`whgtf{&43Ufg-=7}=bbLXzG$1-?^;%j8UhrU#kD)-uV zqxf3ce#2x+`!03q3)IJjA?N$n1>M2sR_2f$$m!GZ+cDV1RU6n`g)+FHwscFJ6 zZy^PQ7trit%_8W0%JF^ENQEp!Qm@$6a09C%m>to6IKwS|R&!vuHDb#Gfnymd=i^WIsB z*e1Ylfuzt=#4sWiZB2w(SQkEJzWU)h^26HY_q&kzu>NhhTHJUg0WI>{D~YE%@i*+X zn;u$jMj&SqW$S1-uEiw3+swZl2pQBiC>bcnny}b%DtPr$bkj zaJ{*8_ImT03r;^5oYXEjT%c}l*xJ^nc}8ClfI+VuGDE;S6ex#ibG8Y$acy#sj25(e}LC6x> z20Ue8P~a)EQOlAKZHQMFJ#6FGaP#$P+OA8wK51QOmU*^oQ@B2H+1}0%o9jn69$nQ2 zQSs9H67D$9u8&t)wYhjFxMgsuk;_FbTuX`zkhEy*vLiQ*uFfUMk&$(HE1pZ1mYxnv zS@ZMf#(l2*_PS@+#VbP>bXA~g47awn)wWt~Tc@}6fJ@PpWb4-Lg00XDCz?vKtt_Q{ zM(`7%1n894R4x?8Idhsy@9HN$c2}{hjLT7#%hUI{KGp5IWMmdyo|-pYp0uiWdn-SU zZ|uQ}mvHB5tZm8ZYt10OXX#p;zSgb?htIAghGKcmH3sSmSC*<>PmI`7)dlE#uQ8r$ z440_&H|?``rT}#GTX>CaOTKS+HrK?xwqv;k;l;z3Kiz!W^@{`!LAqWvH_y>Uz~WpA za0J3s?m^6#h?JHf>Q1?(5*AjB2Xcrmt3v-$Y?uD8} zjM=p5#uk=Gm&u<}7!jNvfrrd`RtAqtTrA~7Dc8z;mAop27-^er!dA^3-rQt=T)}iz z%dEw-7qm7>bwU&xWsO_Q)G1G?@@pCsk1qX7d5x}`#xryhNsxS1O&+4FmfEh&$&3q{ zw~Jeo%a`K1wAF98w8?4Bu6iJB?z-Xgh)0(sII2n}5IL~sE63PQo5V|O9}O;Aeq&jX zo9kCCZ}H*cnl)Zrv$$uvsrtp2!Jv$;_{$Zg-o>G=4Q`{~P`jI}5nLQykTOIRoWw3s zE!!p=%F1>jm@-|qA>O$5rpgz|y;mTW8T@q{gpFQl6f69E>qL{@c#-Y;{Tmnyz41%9 zP@c&EPJpZ^^t}-t#53|T?rks6Eu1l|N^m{yoi?+gwicJY7mz<&4@&RGS{Hz4F*J&U zq9TcwC(BAWPP^;dWmUOK2VBdX<-xt$EF!aa%Rs(Z9ZJUwLi5)#q<4Kswb2FeQUJK% z{T;zd@k^6sWuZ~>Wffzon8P9Tm~vdr)+PF72C{=Q9CW+|6(VOX41R_yMD zyF36PSVHU84c?WlOARZu>V^h%jsD7#rAzQ^4a+;rS zWht&I-fTUTW9#|5{911p-zkBK)~=mEnc^o)18`@(u>tYuo6o^knO>5zeHBTU#G#_- zt{2z(fGk?W)ivYlDtgh%8(QBp`sM%t!1F&@JVz)1u~&o(FjPRcm}V}{k$4GF;RVu8 zR5^Z0kFi?9Mh2aIubsgWSuV$y3u(y=#MI zNl6HOL2pSryaPuz5SPVn@okG16WUuFQVE3|fP`EG7!g^7YPiFWX~}$^fi~Ug*9;>8 z*;GM$C%)2U`A%ndlB9)Pby0zP(xrG!a%a4zw`gy8#^!n6IY*D>!aF>n6Q(pruGnKa zJ%EdNf+wkr+(Fy==~2MKaLg7Zqy&l?GsMiyqPWw@)vI;s*S`c&pn`vRgA~m*2lF46 zH~F1+;;BxiMR8ttc#M1de-cPgHFH{5;du3OHNDn9s@4|I4fQ}W_uc9NFMDR`ZwV<= z1#P={sz}P$3QKkCb}Qrj=pBaV5V<2++6KYY7&lH3 z5v;}UFu2U3g~c(z4?q0h@$%dc|9JGz=N9wyxBofCKc4J{e>`TK;Nou`F87akpI8s{ zSQ)CU(6!D9U7Om2S{(yaxm5IuhqZcktAm7etJBs`p7r{XJ5n0iLP9s8=%_C_iYeq( zq`t8D1f$h|!M~=7*?&`>e^XWaH?=IBLn9D-wG-Yc`{Y5pH7xQ?3j

ka+8i=k!emJ_(st>M=S1p}w3utIg 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 literal 0 HcmV?d00001 diff --git a/src/glsl/minion.frag.glsl b/src/glsl/minion.frag.glsl index 90eaffe..465a911 100644 --- a/src/glsl/minion.frag.glsl +++ b/src/glsl/minion.frag.glsl @@ -1,21 +1,20 @@ // Note: // As for most of these assignments, this is not intended to be a very optimal approach to this algorithm, // as I try to be as clear as possible for future reference - -#define MAX_GEOMETRY_COUNT 50 #define FAR_CLIP 1000.0 #define MAX_ITERATIONS 32 -#define SECONDARY_ITERATIONS 1 +#define SECONDARY_ITERATIONS 2 #define EPSILON 0.01 -#define NORMAL_ESTIMATION_EPSILON .005 +#define NORMAL_ESTIMATION_EPSILON .0075 #define AO_ITERATIONS 4 #define AO_DELTA .133 #define AO_DECAY .8 +#define AO_INTENSITY .3 // SHADOW PARAMETERS -#define SHADOW_ITERATIONS 20 +#define SHADOW_ITERATIONS 18 #define SHADOW_SOFT_FACTOR 6.0 #define SHADOW_EPSILON 0.00 #define SHADOW_OFFSET .01 @@ -28,13 +27,11 @@ struct Ray { uniform mat4 u_viewProjectionMatrix; uniform vec3 u_cameraPosition; -uniform mat4 u_transforms[MAX_GEOMETRY_COUNT]; -uniform vec4 u_buffer[MAX_GEOMETRY_COUNT]; -uniform int u_count; - uniform float u_debug; uniform float time; +uniform sampler2D gradientMap; + varying vec2 f_uv; varying vec4 f_ndcP; @@ -164,28 +161,6 @@ float opUnion( float d1, float d2 ) return min(d1, d2); } -float evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform) -{ - vec3 rep = vec3(18.0, 100.0, 18.0); - point = mod(point + rep * .5, rep) - rep * .5; - vec3 localPoint = (transform * vec4(point, 1.0)).xyz; - - // if(geo.w == 0.0) - // return udBox(localPoint); - // else if(geo.w == 1.0) - // return sdSphere(localPoint); - // else if(geo.w == 2.0) - // return sdCappedCone(localPoint * .5); - // else if(geo.w == 3.0) - // return sdPlane(localPoint); - // else if(geo.w == 4.0) - // return sdTorus(localPoint); - // else if(geo.w == 5.0) - // return sdCappedCylinder(localPoint); - - return FAR_CLIP; -} - vec3 opCheapBend( vec3 p, float magnitude) { float c = cos(magnitude * p.y); @@ -209,6 +184,12 @@ float backgroundSDF(vec3 point) return base; } +float farBackgroundSDF(vec3 point) +{ + float base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5)); + return base; +} + float singleTrackSDF(vec3 point) { float base = udBox(point, vec3(20.0, .3, .3)); @@ -230,11 +211,28 @@ float singleTrackSDF(vec3 point) return base; } +float clawSDF(vec3 point) +{ + float base = udBox(point, vec3(.65)); + + base = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1))); + + point += vec3(0.0, 4.45, 0.0); + base = min(base, udBox(point, vec3(.3, .3, .3))); + + base = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0)); + base = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65)); + + return base; +} + float tracksSDF(vec3 point) { - float base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0)); - // base = min(base, singleTrackSDF(point - vec3(0.0, 8.0, 6.0))); + float base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0)); + // Neverending claws + point.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0); + base = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0))); return base; } @@ -349,33 +347,41 @@ float minionBaseSDF(vec3 point) // Assumes minDistance was initialized to FAR_CLIP // TODO: add material types -void evaluateSceneSDF(vec3 point, out float minDistance) +void evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial) { + hitMaterial = 0.0; minDistance = FAR_CLIP; - minDistance = min(minDistance, minionBaseSDF(point)); - minDistance = min(minDistance, railingSDF(point)); - minDistance = min(minDistance, backgroundSDF(point)); - minDistance = min(minDistance, tracksSDF(point)); - // for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) - // { - // if (i >= u_count) - // break; + float farBackground = farBackgroundSDF(point); + minDistance = min(minDistance, farBackground); + hitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001)); + + float minion = minionBaseSDF(point); + minDistance = min(minDistance, minion); + hitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001)); - // vec4 geo = u_buffer[i]; - // mat4 transform = u_transforms[i]; - // float d = evaluateGeometrySDF(point, geo, transform); - - // minDistance = min(d, minDistance); - // } + float railing = railingSDF(point); + minDistance = min(minDistance, railing); + hitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001)); + + float background = backgroundSDF(point); + minDistance = min(minDistance, background); + hitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001)); + + float tracks = tracksSDF(point); + minDistance = min(minDistance, tracks); + hitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001)); } // This method is useful for just the distance float evaluateSceneSDFSimple(vec3 point) { - // TODO: rewrite everything float minDistance = FAR_CLIP; - evaluateSceneSDF(point, minDistance); + minDistance = min(minDistance, minionBaseSDF(point)); + minDistance = min(minDistance, railingSDF(point)); + minDistance = min(minDistance, backgroundSDF(point)); + minDistance = min(minDistance, farBackgroundSDF(point)); + minDistance = min(minDistance, tracksSDF(point)); return minDistance; } @@ -439,24 +445,30 @@ float evaluateAmbientOcclusion(vec3 point, vec3 normal) ao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay; } - return clamp(1.0 - ao * .15, 0.0, 1.0); + return clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0); } -vec3 shade(vec3 point, Ray ray, float t) +vec3 shade(vec3 point, Ray ray, float t, float material) { vec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON ); vec3 light = vec3(1.0, 5.0, 7.0); vec3 l = light - point; - float diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0); + float diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5; - float falloff = 25.0 / pow(length(l) + EPSILON, 2.0); - float shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l); + float falloff = 40.0 / pow(length(l) + EPSILON, 2.0); + float shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0); float ao = evaluateAmbientOcclusion(point, normal); - return vec3(diffuse * falloff * shadow * ao); + float facingRatio = dot(-ray.direction, normal); + + vec4 g = texture2D(gradientMap, vec2((material * .2) + .1, facingRatio)); + + vec3 color = mix(g.rgb, vec3(diffuse), .15); + + return color * (shadow * ao * falloff); } void main() @@ -470,10 +482,11 @@ void main() float t = 0.0; float d = FAR_CLIP; float iterationCount = 0.0; + float hitMaterial = 0.0; for(int j = 0; j < MAX_ITERATIONS; j++) { - evaluateSceneSDF(current, d); + evaluateSceneSDF(current, d, hitMaterial); if(d < EPSILON) break; @@ -504,7 +517,7 @@ void main() iterationCount += 1.0; } - color = shade(current, ray, t); + color = shade(current, ray, t, hitMaterial); // Gamma correction color = pow(color, vec3(.45454)); diff --git a/src/main.js b/src/main.js index f97fe7c..17adc1e 100644 --- a/src/main.js +++ b/src/main.js @@ -60,7 +60,7 @@ window.addEventListener('load', function() { var gui = new DAT.GUI(); var options = { - strategy: 'Scene', + strategy: 'Ray Marching', debug : false } @@ -139,7 +139,7 @@ window.addEventListener('load', function() { controls.target.set(0,1.5,0); - camera.position.set(2, 6, 15); + camera.position.set(3, 3.5, 13); camera.lookAt(new THREE.Vector3(0,0,0)); var rayMarcher = new RayMarcher(renderer, scene, camera); @@ -158,9 +158,9 @@ window.addEventListener('load', function() { if (options.strategy === 'Proxy Geometry') { renderer.render(scene, camera); } else if (options.strategy === 'Ray Marching') { - rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false); + rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time); } else if (options.strategy === 'Scene') { - rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true); + rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time); } stats.end(); requestAnimationFrame(tick); diff --git a/src/rayMarching.js b/src/rayMarching.js index 1c21b3d..57ad7bf 100644 --- a/src/rayMarching.js +++ b/src/rayMarching.js @@ -8,6 +8,7 @@ export default function RayMarcher(renderer, scene, camera) { var minionComposer = new EffectComposer(renderer); var minionPass = new EffectComposer.ShaderPass({ uniforms: { + gradientMap: { type: "t", value: null}, u_buffer: { type: '4fv', value: new Float32Array() @@ -20,6 +21,10 @@ export default function RayMarcher(renderer, scene, camera) { type: 'f', value: 0 }, + time: { + type: 'f', + value: 0 + }, u_viewProjectionMatrix : { type: 'm4', value: new THREE.Matrix4() @@ -54,6 +59,10 @@ export default function RayMarcher(renderer, scene, camera) { type: 'f', value: 0 }, + time: { + type: 'f', + value: 0 + }, u_viewProjectionMatrix : { type: 'm4', value: new THREE.Matrix4() @@ -72,6 +81,11 @@ export default function RayMarcher(renderer, scene, camera) { }); shaderPass.renderToScreen = true; + var txLoader = new THREE.TextureLoader(); + txLoader.load('./images/gradients.png', function(texture) { + minionPass.material.uniforms.gradientMap.value = texture; + }); + // Adding this composer we force updating the scene transformations composer.addPass(new EffectComposer.RenderPass(scene, camera)); composer.addPass(shaderPass); @@ -79,7 +93,7 @@ export default function RayMarcher(renderer, scene, camera) { var inverseProjectionMatrix = new THREE.Matrix4(); return { - render: function(buffer, transforms, camera, options, minionScene) + render: function(buffer, transforms, camera, options, minionScene, time) { camera.updateMatrix(); @@ -92,6 +106,7 @@ export default function RayMarcher(renderer, scene, camera) { minionPass.material.uniforms.u_transforms.value = transforms; minionPass.material.uniforms.u_count.value = 0; minionPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + minionPass.material.uniforms.time.value = time; minionPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); minionPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); @@ -104,6 +119,7 @@ export default function RayMarcher(renderer, scene, camera) { shaderPass.material.uniforms.u_transforms.value = transforms; shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE; shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + shaderPass.material.uniforms.time.value = time; shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); From 549ba14e70dc569d8bd3797c4c9a3801e2ccfd27 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 04:40:19 -0500 Subject: [PATCH 14/26] * Fix --- package.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 737868d..27b7eb5 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,14 @@ { "scripts": { "start": "webpack-dev-server --hot --inline", - "deploy": "npm run build && node deploy.js", - "build": "webpack" + "build": "webpack", + "deploy": "npm run build && node deploy.js" + }, + "gh-pages-deploy": { + "prep": [ + "build" + ], + "noprompt": true }, "dependencies": { "babel-core": "^6.23.1", From 7dfac2bd3c019c19257121bfd1fb71635ae85576 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 04:41:15 -0500 Subject: [PATCH 15/26] * Build --- build/bundle.js | 227 ++++++++++++++++++++++++++++++++++++++------ build/bundle.js.map | 2 +- 2 files changed, 197 insertions(+), 32 deletions(-) diff --git a/build/bundle.js b/build/bundle.js index 746552e..fdf34ab 100644 --- a/build/bundle.js +++ b/build/bundle.js @@ -64,15 +64,23 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - __webpack_require__(16); + __webpack_require__(17); var THREE = __webpack_require__(6); - var OrbitControls = __webpack_require__(17)(THREE); + var OrbitControls = __webpack_require__(18)(THREE); var BoxGeometry = new THREE.BoxGeometry(1, 1, 1); var SphereGeometry = new THREE.SphereGeometry(1, 32, 32); var ConeGeometry = new THREE.ConeGeometry(1, 1); var PlaneGeometry = new THREE.PlaneGeometry(100, 100, 1, 1); + var TorusGeometry = new THREE.TorusGeometry(1, .2, 16, 16, Math.PI * 2); + var CylinderGeometry = new THREE.CylinderGeometry(1, 1, 2, 16, 17, false); + + var Engine = { + time: 0.0, + deltaTime: 0.0, + clock: null + }; window.addEventListener('load', function () { var stats = new _statsJs2.default(); @@ -90,6 +98,8 @@ renderer.setClearColor(0x999999, 1.0); document.body.appendChild(renderer.domElement); + Engine.clock = new THREE.Clock(); + var controls = new OrbitControls(camera, renderer.domElement); controls.enableDamping = true; controls.enableZoom = true; @@ -97,6 +107,9 @@ controls.zoomSpeed = 1.0; controls.panSpeed = 2.0; + camera.fov = 45; + camera.updateProjectionMatrix(); + window.addEventListener('resize', function () { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); @@ -110,7 +123,7 @@ debug: false }; - gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching']); + gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Scene']); gui.add(options, 'debug'); scene.add(new THREE.AxisHelper(20)); @@ -119,29 +132,84 @@ var proxyGeometry = new _proxy_geometry2.default(); var boxMesh = new THREE.Mesh(BoxGeometry, _proxy_geometry.ProxyMaterial); + boxMesh.userData = { geoType: 0 }; + var sphereMesh = new THREE.Mesh(SphereGeometry, _proxy_geometry.ProxyMaterial); + sphereMesh.userData = { geoType: 1 }; + var coneMesh = new THREE.Mesh(ConeGeometry, _proxy_geometry.ProxyMaterial); + coneMesh.userData = { geoType: 2 }; + + var cylinderMesh = new THREE.Mesh(CylinderGeometry, _proxy_geometry.ProxyMaterial); + cylinderMesh.userData = { geoType: 5 }; + var planeMesh = new THREE.Mesh(PlaneGeometry, _proxy_geometry.ProxyMaterial); + var torusMesh = new THREE.Mesh(TorusGeometry, _proxy_geometry.ProxyMaterial); + // These transformations need to be hidden + var g1 = new THREE.Group(); planeMesh.rotateX(Math.PI * -.5); - planeMesh.position.set(0, -1, 0); + g1.add(planeMesh); + g1.userData = { geoType: 3 }; + + var torusWrapper = new THREE.Group(); + torusMesh.rotateX(Math.PI * -.5); + torusWrapper.add(torusMesh); + torusWrapper.userData = { geoType: 4 }; + + g1.position.set(0, -1, 0); boxMesh.position.set(-3, 0, 0); coneMesh.position.set(3, 0, 0); + torusWrapper.position.set(0, 0, 4); + cylinderMesh.position.set(4, 1, 4); + + coneMesh.onBeforeRender = function () { + var scale = Math.sin(Engine.time) * .35 + 1; + coneMesh.scale.set(scale, scale, scale); + }; + + boxMesh.onBeforeRender = function () { + boxMesh.position.y = Math.sin(Engine.time) * 2 + 1; + }; + + cylinderMesh.onBeforeRender = function () { + cylinderMesh.position.y = Math.sin(Engine.time + 1.5) + 1; + cylinderMesh.rotateX(Engine.deltaTime * Math.PI); + }; + + sphereMesh.onBeforeRender = function () { + sphereMesh.position.x = Math.sin(Engine.time + .5); + sphereMesh.position.z = Math.cos(Engine.time + .5) - .5; + sphereMesh.position.y = Math.sin(Engine.time + 2.3) - .5; + }; + + torusMesh.onBeforeRender = function () { + torusWrapper.rotateZ(Engine.deltaTime * Math.PI); + }; proxyGeometry.add(boxMesh); proxyGeometry.add(sphereMesh); proxyGeometry.add(coneMesh); - proxyGeometry.add(planeMesh); + proxyGeometry.add(g1); + proxyGeometry.add(torusWrapper); + proxyGeometry.add(cylinderMesh); scene.add(proxyGeometry.group); - camera.position.set(5, 10, 15); + controls.target.set(0, 1.5, 0); + + camera.position.set(3, 3.5, 13); camera.lookAt(new THREE.Vector3(0, 0, 0)); - controls.target.set(0, 0, 0); var rayMarcher = new _rayMarching2.default(renderer, scene, camera); (function tick() { + var deltaTime = Engine.clock.getDelta(); + + Engine.time += deltaTime; + Engine.cameraTime += deltaTime; + Engine.deltaTime = deltaTime; + controls.update(); stats.begin(); proxyGeometry.update(); @@ -149,7 +217,9 @@ if (options.strategy === 'Proxy Geometry') { renderer.render(scene, camera); } else if (options.strategy === 'Ray Marching') { - rayMarcher.render(proxyGeometry.buffer, camera, options); + rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time); + } else if (options.strategy === 'Scene') { + rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time); } stats.end(); requestAnimationFrame(tick); @@ -4628,6 +4698,7 @@ this.group = new THREE.Group(); this._buffer = new Float32Array(); + this._transforms = new Float32Array(); } _createClass(ProxyGeometry, [{ @@ -4635,6 +4706,7 @@ value: function add(mesh) { this.group.add(mesh); this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length); + this._transforms = new Float32Array(16 * this.group.children.length); this.computeBuffer(); } }, { @@ -4642,6 +4714,7 @@ value: function remove(mesh) { this.group.remove(mesh); this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length); + this._transforms = new Float32Array(16 * this.group.children.length); this.computeBuffer(); } }, { @@ -4652,6 +4725,7 @@ for (var i = 0; i < children.length; ++i) { var child = children[i]; + // TODO: animate objects } this.computeBuffer(); @@ -4661,21 +4735,30 @@ value: function computeBuffer() { var children = this.group.children; + for (var i = 0; i < children.length; ++i) { var child = children[i]; this._buffer[PROXY_BUFFER_SIZE * i] = child.position.x; this._buffer[PROXY_BUFFER_SIZE * i + 1] = child.position.y; this._buffer[PROXY_BUFFER_SIZE * i + 2] = child.position.z; - if (child.geometry instanceof THREE.BoxGeometry) { - this._buffer[PROXY_BUFFER_SIZE * i + 3] = 0; - } else if (child.geometry instanceof THREE.SphereGeometry) { - this._buffer[PROXY_BUFFER_SIZE * i + 3] = 1; - } else if (child.geometry instanceof THREE.ConeGeometry) { - this._buffer[PROXY_BUFFER_SIZE * i + 3] = 2; - } else if (child.geometry instanceof THREE.PlaneGeometry) { - this._buffer[PROXY_BUFFER_SIZE * i + 3] = 3; - } + var worldToLocal = new THREE.Matrix4(); + worldToLocal.getInverse(child.matrixWorld); + worldToLocal.toArray(this._transforms, i * 16); + + this._buffer[PROXY_BUFFER_SIZE * i + 3] = child.userData.geoType; + // if (child.geometry instanceof THREE.BoxGeometry) { + // } else if (child.geometry instanceof THREE.SphereGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 1; + // } else if (child.geometry instanceof THREE.ConeGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 2; + // } else if (child.geometry instanceof THREE.PlaneGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 3; + // } else if (child.geometry instanceof THREE.TorusGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 4; + // } else if (child.geometry instanceof THREE.CylinderGeometry) { + // this._buffer[PROXY_BUFFER_SIZE*i+3] = 5; + // } } } }, { @@ -4683,6 +4766,11 @@ get: function get() { return this._buffer; } + }, { + key: 'transforms', + get: function get() { + return this._transforms; + } }]); return ProxyGeometry; @@ -48013,12 +48101,52 @@ var EffectComposer = __webpack_require__(8)(THREE); function RayMarcher(renderer, scene, camera) { + + var minionComposer = new EffectComposer(renderer); + var minionPass = new EffectComposer.ShaderPass({ + uniforms: { + gradientMap: { type: "t", value: null }, + u_buffer: { + type: '4fv', + value: new Float32Array() + }, + u_count: { + type: 'i', + value: 0 + }, + u_debug: { + type: 'f', + value: 0 + }, + time: { + type: 'f', + value: 0 + }, + u_viewProjectionMatrix: { + type: 'm4', + value: new THREE.Matrix4() + }, + u_cameraPosition: { + type: 'v3', + value: new THREE.Vector3(0, 0, 0) + }, + u_transforms: { + type: 'm4v', + value: new Float32Array() + } + }, + vertexShader: __webpack_require__(14), + fragmentShader: __webpack_require__(15) + }); + minionPass.renderToScreen = true; + minionComposer.addPass(minionPass); + var composer = new EffectComposer(renderer); var shaderPass = new EffectComposer.ShaderPass({ uniforms: { u_buffer: { type: '4fv', - value: undefined + value: new Float32Array() }, u_count: { type: 'i', @@ -48028,6 +48156,10 @@ type: 'f', value: 0 }, + time: { + type: 'f', + value: 0 + }, u_viewProjectionMatrix: { type: 'm4', value: new THREE.Matrix4() @@ -48035,31 +48167,58 @@ u_cameraPosition: { type: 'v3', value: new THREE.Vector3(0, 0, 0) + }, + u_transforms: { + type: 'm4v', + value: new Float32Array() } }, vertexShader: __webpack_require__(14), - fragmentShader: __webpack_require__(15) + fragmentShader: __webpack_require__(16) }); shaderPass.renderToScreen = true; + + var txLoader = new THREE.TextureLoader(); + txLoader.load('./images/gradients.png', function (texture) { + minionPass.material.uniforms.gradientMap.value = texture; + }); + + // Adding this composer we force updating the scene transformations + composer.addPass(new EffectComposer.RenderPass(scene, camera)); composer.addPass(shaderPass); var inverseProjectionMatrix = new THREE.Matrix4(); return { - render: function render(buffer, camera, options) { - - shaderPass.material.uniforms.u_buffer.value = buffer; - shaderPass.material.uniforms.u_count.value = buffer.length / _proxy_geometry.PROXY_BUFFER_SIZE; - shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + render: function render(buffer, transforms, camera, options, minionScene, time) { camera.updateMatrix(); camera.updateProjectionMatrix(); - inverseProjectionMatrix.getInverse(camera.projectionMatrix); - shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); - shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); - composer.render(); + if (minionScene) { + minionPass.material.uniforms.u_buffer.value = buffer; + minionPass.material.uniforms.u_transforms.value = transforms; + minionPass.material.uniforms.u_count.value = 0; + minionPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + minionPass.material.uniforms.time.value = time; + + minionPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); + minionPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); + + minionComposer.render(); + } else { + shaderPass.material.uniforms.u_buffer.value = buffer; + shaderPass.material.uniforms.u_transforms.value = transforms; + shaderPass.material.uniforms.u_count.value = buffer.length / _proxy_geometry.PROXY_BUFFER_SIZE; + shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0; + shaderPass.material.uniforms.time.value = time; + + shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix); + shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone(); + + composer.render(); + } } }; } @@ -48487,22 +48646,28 @@ /* 14 */ /***/ function(module, exports) { - module.exports = "varying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\nvoid main() {\r\n\tvec2 tmp = vec2(uv.x, uv.y);\r\n tmp = (tmp * 2.0) - vec2(1.0);\r\n f_ndcP = vec4(tmp, 1.0, 1.0) * 1000.0;\r\n f_uv = uv;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}" + module.exports = "#define FAR_CLIP 1000.0\r\n\r\nvarying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\nvarying vec3 f_rayDir;\r\nvarying vec3 f_rayPos;\r\n\r\nuniform mat4 u_viewProjectionMatrix;\r\nuniform vec3 u_cameraPosition;\r\n\r\nvoid main() {\r\n\tvec2 tmp = vec2(uv.x, uv.y);\r\n tmp = (tmp * 2.0) - vec2(1.0);\r\n f_ndcP = vec4(tmp, 1.0, 1.0) * FAR_CLIP;\r\n f_uv = uv;\r\n\r\n f_rayDir = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - u_cameraPosition);\r\n f_rayPos = u_cameraPosition;\r\n\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}" /***/ }, /* 15 */ /***/ function(module, exports) { - module.exports = "#define MAX_GEOMETRY_COUNT 100\r\n#define FAR_CLIP 1000.0\r\n#define SHADOW_ITERATIONS 64\r\n#define MAX_ITERATIONS 100\r\n#define EPSILON 0.005\r\n\r\n/* This is how I'm packing the data\r\nstruct geometry_t {\r\n vec3 position;\r\n float type;\r\n};\r\n*/\r\n\r\nstruct Ray {\r\n\tvec3 position;\r\n\tvec3 direction;\r\n};\r\n\r\nuniform mat4 u_viewProjectionMatrix;\r\nuniform vec3 u_cameraPosition;\r\n\r\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\r\nuniform int u_count;\r\n\r\nuniform float u_debug;\r\n\r\nvarying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\r\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\r\n{\r\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\r\n}\r\n\r\nvec3 debugIterations(float factor)\r\n{\r\n\tvec3 a = vec3(0.478, 0.500, 0.500);\r\n\tvec3 b = vec3(0.500);\r\n\tvec3 c = vec3(0.688, 0.748, 0.748);\r\n\tvec3 d = vec3(0.318, 0.588, 0.908);\r\n\r\n\treturn palette(factor, a, b, c, d);\r\n}\r\n\r\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\r\nfloat sdSphere( vec3 p, float s )\r\n{\r\n\treturn length(p) - s;\r\n}\r\n\r\nfloat udBox( vec3 p, vec3 b )\r\n{\r\n\treturn length(max(abs(p) - b, 0.0));\r\n}\r\n\r\nfloat sdPlane( vec3 p, vec4 n )\r\n{\r\n // n must be normalized\r\n return dot(p,n.xyz) + n.w;\r\n}\r\n\r\nfloat udRoundBox( vec3 p, vec3 b, float r )\r\n{\r\n\treturn length(max(abs(p) - b, 0.0)) - r;\r\n}\r\n\r\nfloat sdCappedCone( in vec3 p, in vec3 c )\r\n{\r\n\tp.y -= .25;\r\n vec2 q = vec2( length(p.xz), p.y );\r\n vec2 v = vec2( c.z*c.y/c.x, -c.z );\r\n vec2 w = v - q;\r\n vec2 vv = vec2( dot(v,v), v.x*v.x );\r\n vec2 qv = vec2( dot(v,w), v.x*w.x );\r\n vec2 d = max(qv,0.0)*qv/vv;\r\n return sqrt( dot(w,w) - max(d.x,d.y) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\r\n}\r\n\r\nRay getRay()\r\n{\r\n\tRay ray;\r\n\tray.position = u_cameraPosition;\r\n\tray.direction = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - ray.position);\r\n\treturn ray;\r\n}\r\n\r\nfloat evaluateGeometrySDF(vec3 point, vec4 geo)\r\n{\r\n\tvec3 localPoint = point - geo.xyz;\r\n\r\n if(geo.w == 0.0)\r\n \treturn udBox(localPoint, vec3(.5));\r\n\telse if(geo.w == 1.0)\r\n\t\treturn sdSphere(localPoint, 1.0);\r\n\telse if(geo.w == 2.0)\r\n\t\treturn sdCappedCone(localPoint * .5, normalize(vec3(1.0)));\r\n\telse if(geo.w == 3.0)\r\n\t\treturn sdPlane(localPoint, vec4(0.0, 1.0, 0.0, 0.0));\r\n\r\n\treturn FAR_CLIP;\r\n}\r\n\r\n// This method is useful for just the distance\r\nfloat evaluateSceneSDFSimple(vec3 point)\r\n{\r\n\tfloat minDistance = FAR_CLIP;\r\n\r\n \tfor (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \r\n {\r\n if (i >= u_count)\r\n break;\r\n\r\n vec4 geo = u_buffer[i];\r\n float d = evaluateGeometrySDF(point, geo);\r\n\r\n \tif(d < minDistance)\r\n \t\tminDistance = d;\r\n }\r\n\r\n return minDistance;\r\n}\r\n\r\n// Assumes minDistance was initialized to FAR_CLIP\r\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\r\n{\t\r\n\tminDistance = FAR_CLIP;\r\n\r\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \r\n {\r\n if (i >= u_count)\r\n break;\r\n\r\n vec4 geo = u_buffer[i];\r\n\t\tfloat d = evaluateGeometrySDF(point, geo);\r\n \r\n \tif(d < minDistance)\r\n \t\tminDistance = d;\r\n }\r\n}\r\n\r\nvec3 estimateSceneGradient(vec3 point, float epsilon)\r\n{\r\n\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\r\n\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\r\n\r\n\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\r\n\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\r\n\r\n\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\r\n\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\r\n\r\n\treturn normalize(vec3(x,y,z));\r\n}\r\n\r\n\r\nfloat evaluateShadows(vec3 point, vec3 light)\r\n{\r\n\tRay ray;\r\n\tray.position = point;\r\n\tray.direction = (light - point);\r\n\r\n\tfloat maxDistance = length(ray.direction);\r\n\tray.direction = normalize(ray.direction);\r\n\r\n float t = 0.0;\r\n vec3 current = ray.position;\r\n\r\n\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = evaluateSceneSDFSimple(current);\r\n\r\n\t\tif(d < EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\r\n\t\tif(t > maxDistance)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\treturn 1.0 - smoothstep(t, t + .5, maxDistance);\r\n}\r\n\r\nvoid main() \r\n{\r\n\tRay ray = getRay();\r\n\r\n vec3 color;\r\n vec3 current = ray.position;\r\n float t = 0.0;\r\n float iterationCount = 0.0;\r\n\r\n\tfor(int j = 0; j < MAX_ITERATIONS; j++)\r\n\t{\r\n\t\tfloat d = FAR_CLIP;\r\n\t\tevaluateSceneSDF(current, d);\r\n\r\n\t\tif(d < EPSILON)\r\n\t\t{\r\n\t\t\tvec3 normal = estimateSceneGradient(current, EPSILON);\r\n\r\n\t\t\tvec3 light = vec3(0.0, 4.0, 3.0);\r\n\t\t\tvec3 l = light - current;\r\n\r\n\t\t\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\r\n\t\t\tfloat diffuse = clamp(dot(normal, normalize(l)) * falloff, 0.0, 1.0);\r\n\t\t\tfloat shadow = evaluateShadows(current + normal * .05, light);\r\n\r\n\t\t\tcolor = vec3(diffuse * shadow);\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tcolor = pow(color, vec3(.45454));\r\n\r\n\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS));\r\n\tcolor = mix(color, debugColor, u_debug);\r\n\r\n gl_FragColor = vec4(color, 1.0);\r\n}" + module.exports = "// Note:\r\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\r\n// as I try to be as clear as possible for future reference\r\n#define FAR_CLIP 1000.0\r\n#define MAX_ITERATIONS 32\r\n#define SECONDARY_ITERATIONS 2\r\n#define EPSILON 0.01\r\n\r\n#define NORMAL_ESTIMATION_EPSILON .0075\r\n\r\n#define AO_ITERATIONS 4\r\n#define AO_DELTA .133\r\n#define AO_DECAY .8\r\n#define AO_INTENSITY .3\r\n\r\n// SHADOW PARAMETERS\r\n#define SHADOW_ITERATIONS 18\r\n#define SHADOW_SOFT_FACTOR 6.0\r\n#define SHADOW_EPSILON 0.00\r\n#define SHADOW_OFFSET .01\r\n\r\nstruct Ray {\r\n\tvec3 position;\r\n\tvec3 direction;\r\n};\r\n\r\nuniform mat4 u_viewProjectionMatrix;\r\nuniform vec3 u_cameraPosition;\r\n\r\nuniform float u_debug;\r\nuniform float time;\r\n\r\nuniform sampler2D gradientMap;\r\n\r\nvarying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\nvarying vec3 f_rayPos;\r\nvarying vec3 f_rayDir;\r\n\r\n// Reference: https://github.com/stackgl/glsl-smooth-min\r\nfloat smin(float a, float b, float k) \r\n{\r\n float res = exp(-k * a) + exp(-k * b);\r\n return -log(res) / k;\r\n}\r\n\r\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\r\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\r\n{\r\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\r\n}\r\n\r\nvec3 debugIterations(float factor)\r\n{\r\n\tvec3 a = vec3(0.478, 0.500, 0.500);\r\n\tvec3 b = vec3(0.500);\r\n\tvec3 c = vec3(0.688, 0.748, 0.748);\r\n\tvec3 d = vec3(0.318, 0.588, 0.908);\r\n\r\n\treturn palette(factor, a, b, c, d);\r\n}\r\n\r\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\r\n// But they are tweaked for their threejs equivalents\r\nfloat sdSphere( vec3 p, float r )\r\n{\r\n\treturn length(p) - r;\r\n}\r\n\r\nfloat udBox(vec3 p, vec3 b)\r\n{\r\n\treturn length(max(abs(p) - b, 0.0));\r\n}\r\n\r\n// TODO: build a parabola mixed with a plane to solve the \r\n// grazing angle/boundary iteration problem\r\nfloat sdPlane( vec3 p)\r\n{\r\n\treturn p.y;\r\n}\r\n\r\nfloat sdCappedCylinder( vec3 p, vec2 h)\r\n{\r\n vec2 d = abs(vec2(length(p.xz),p.y)) - h;\r\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\r\n}\r\n\r\nfloat pow8(float x)\r\n{\r\n\tx *= x; // xˆ2\r\n\tx *= x; // xˆ4\r\n\treturn x * x;\r\n}\r\n\r\nfloat length8(vec2 v)\r\n{\r\n\treturn pow(pow8(v.x) + pow8(v.y), .125);\r\n}\r\n// float wheelDistance(Point3 X, Point3 C, float r, float R) {\r\n// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R;\r\n// }\r\n\r\nfloat sdTorus82( vec3 p, vec2 t )\r\n{\r\n vec2 q = vec2(length(p.xz)-t.x,p.y);\r\n return length8(q)-t.y;\r\n}\r\n\r\nfloat sdTorus( vec3 p)\r\n{\r\n vec2 q = vec2(length(p.xz)-1.0,p.y);\r\n return length(q) - .2;\r\n}\r\n\r\nfloat sdHexPrism( vec3 p, vec2 h )\r\n{\r\n vec3 q = abs(p);\r\n return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\r\n}\r\n\r\nfloat udRoundBox( vec3 p, vec3 b, float r )\r\n{\r\n\treturn length(max(abs(p) - b, 0.0)) - r;\r\n}\r\n\r\nfloat sdCappedCone( in vec3 p)\r\n{\r\n\tp.y -= .25;\r\n vec2 q = vec2( length(p.xz), p.y );\r\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\r\n vec2 w = v - q;\r\n vec2 vv = vec2( dot(v,v), v.x*v.x );\r\n vec2 qv = vec2( dot(v,w), v.x*w.x );\r\n vec2 d = max(qv,0.0) * qv / vv;\r\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\r\n}\r\n\r\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\r\n{\r\n vec3 pa = p - a, ba = b - a;\r\n float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\r\n return length( pa - ba*h ) - r;\r\n}\r\n\r\nRay getRay(vec3 origin, vec3 dir)\r\n{\r\n\tRay ray;\r\n\tray.position = origin;\r\n\tray.direction = dir;\r\n\treturn ray;\r\n}\r\n\r\nfloat sdEllipsoid( in vec3 p, in vec3 r )\r\n{\r\n return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\r\n}\r\n\r\nfloat opUnion( float d1, float d2 )\r\n{\r\n return min(d1, d2);\r\n}\r\n\r\nvec3 opCheapBend( vec3 p, float magnitude)\r\n{\r\n float c = cos(magnitude * p.y);\r\n float s = sin(magnitude * p.y);\r\n mat2 m = mat2(c, -s, s, c);\r\n vec3 q = vec3( m * p.xy, p.z);\r\n return q;\r\n}\r\n\r\nfloat repeatDimension(float x, float m, float extent)\r\n{\r\n\treturn mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent));\r\n}\r\n\r\nfloat backgroundSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5));\r\n\tbase = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0));\r\n\tbase = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5)));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat farBackgroundSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5));\r\n\treturn base;\r\n}\r\n\r\nfloat singleTrackSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point, vec3(20.0, .3, .3));\r\n\tbase = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5)));\r\n\tbase = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5)));\r\n\r\n\tvec3 detailP = point + vec3(0.0, 0.0, -0.3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, udBox(detailP, vec3(.075, .3, .1)));\r\n\r\n\tdetailP = point + vec3(0.5, .35, -.3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, sdSphere(detailP, .1));\r\n\r\n\tdetailP = point + vec3(0.75, .35, .3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, sdSphere(detailP, .1));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat clawSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point, vec3(.65));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1)));\r\n\r\n\tpoint += vec3(0.0, 4.45, 0.0);\r\n\tbase = min(base, udBox(point, vec3(.3, .3, .3)));\r\n\r\n\tbase = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0));\r\n\tbase = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat tracksSDF(vec3 point)\r\n{\r\n\tfloat base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0));\t\r\n\r\n\t// Neverending claws\r\n\tpoint.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0);\r\n\tbase = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0)));\r\n\treturn base;\r\n}\r\n\r\nfloat railingSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2)));\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2)));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25)));\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5)));\r\n\r\n\r\n\t// Railing bump map ;)\r\n\tvec3 bumpPoint = point + vec3(0.0, 1.15, 0.0);\r\n\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\r\n\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\r\n\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0);\r\n\r\n\tbumpPoint = point + vec3(0.25, 1.15, 0.25);\r\n\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\r\n\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\r\n\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0);\r\n\r\n\tvec3 columnPoint = point + vec3(3.0, 1.25, -2.5);\r\n\tcolumnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0));\r\n\tcolumnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0));\r\n\r\n\tfloat column = udBox(columnPoint, vec3(.35, 50.0, .35));\r\n\tcolumn = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\r\n\tcolumn = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\r\n\r\n\tbase = min(base, column);\r\n\r\n\tvec3 rep = vec3(1.0, 100.0, 10.0);\r\n\r\n\tvec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy;\r\n\tscrewPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5;\r\n\tfloat screws1 = sdHexPrism(screwPoint, vec2(.1));\r\n\tscrewPoint.y += 4.25;\r\n\tfloat screws2 = sdHexPrism(screwPoint, vec2(.1));\r\n\r\n\treturn min(min(base, screws1), screws2);\r\n}\r\n\r\nfloat minionBaseSDF(vec3 point)\r\n{\r\n\tvec3 blendOffset = vec3(0.0, 1.5, 0.0);\r\n\tvec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset;\r\n\tvec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset;\r\n\r\n\tfloat base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15);\r\n\r\n\tfloat hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135);\r\n\tfloat hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135);\r\n\r\n\tfloat foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2);\r\n\tfloat foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2);\r\n\r\n\tfloat dist = smin(base, hand1, 5.0);\r\n\tdist = smin(dist, hand2, 5.0);\r\n\tdist = smin(dist, foot1, 5.0);\r\n\tdist = smin(dist, foot2, 5.0);\r\n\r\n\t// Left Hand\r\n\tbendedPointSym.y -= .15;\r\n\tfloat handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05));\r\n\thandBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\r\n\r\n\t// Base\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0);\r\n\r\n\t// Fingers (note: cylinders would make it better.. but no time!)\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0);\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0);\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0);\r\n\r\n\tdist = min(dist, handBase1);\r\n\r\n\t// Right Hand\r\n\tbendedPoint.y -= .15;\r\n\tfloat handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05));\r\n\thandBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\r\n\r\n\t// Base\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0);\r\n\r\n\t// Fingers\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0);\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0);\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0);\r\n\r\n\tdist = min(dist, handBase2);\r\n\r\n\tvec3 glassPoint = point - vec3(0.0, 3.0, 1.15);\t\r\n\tfloat glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1));\r\n\r\n\tfloat belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125));\r\n\tbelt = max(belt, -sdSphere(glassPoint, .5));\r\n\tglassBase = min(glassBase, belt);\r\n\tdist = min(dist, glassBase);\r\n\r\n\tdist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55));\r\n\r\n\tfloat mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0));\r\n\r\n\tdist = max(dist, -mouth);\r\n\r\n\treturn dist;\r\n}\r\n\r\n// Assumes minDistance was initialized to FAR_CLIP\r\n// TODO: add material types\r\nvoid evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial)\r\n{\t\r\n\thitMaterial = 0.0;\r\n\tminDistance = FAR_CLIP;\r\n\r\n\tfloat farBackground = farBackgroundSDF(point);\r\n\tminDistance = min(minDistance, farBackground);\r\n\thitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001));\r\n\r\n\tfloat minion = minionBaseSDF(point);\r\n\tminDistance = min(minDistance, minion);\r\n\thitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001));\r\n\r\n\tfloat railing = railingSDF(point);\r\n\tminDistance = min(minDistance, railing);\r\n\thitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001));\r\n\r\n\tfloat background = backgroundSDF(point);\r\n\tminDistance = min(minDistance, background);\r\n\thitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001));\r\n\t\r\n\tfloat tracks = tracksSDF(point);\r\n\tminDistance = min(minDistance, tracks);\r\n\thitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001));\r\n}\r\n\r\n// This method is useful for just the distance\r\nfloat evaluateSceneSDFSimple(vec3 point)\r\n{\r\n\tfloat minDistance = FAR_CLIP;\r\n\tminDistance = min(minDistance, minionBaseSDF(point));\r\n\tminDistance = min(minDistance, railingSDF(point));\r\n\tminDistance = min(minDistance, backgroundSDF(point));\r\n\tminDistance = min(minDistance, farBackgroundSDF(point));\r\n\tminDistance = min(minDistance, tracksSDF(point));\r\n\treturn minDistance;\t\r\n}\r\n\r\nvec3 estimateSceneGradient(vec3 point, float epsilon)\r\n{\r\n\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\r\n\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\r\n\r\n\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\r\n\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\r\n\r\n\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\r\n\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\r\n\r\n\treturn normalize(vec3(x,y,z));\r\n}\r\n\r\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\r\n// with tweaks\r\nfloat evaluateShadows(vec3 origin, vec3 toLight)\r\n{\r\n\tvec3 direction = toLight;\r\n\tfloat maxDistance = length(direction);\r\n\tdirection /= maxDistance;\r\n\r\n float t = SHADOW_EPSILON;\r\n float soft = .5;\r\n\r\n // WebGL doesnt like loops that cannot be easily unrolled\r\n\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\r\n\r\n\t\tif(d < SHADOW_EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\r\n\r\n\t\tif(t >= maxDistance)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t}\r\n\r\n\tsoft = clamp(soft * 2.0, 0.0, 1.0);\r\n\r\n\t// This is a mix of soft shadows and a fake AO\r\n\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\r\n}\r\n\r\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\r\n{\r\n\tfloat ao = 0.0;\r\n\tfloat delta = AO_DELTA;\r\n\tfloat decay = 1.0;\r\n\r\n\tfor(int i = 0; i < AO_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = float(i) * delta;\r\n\t\tdecay *= AO_DECAY;\r\n\t\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\r\n\t}\r\n\r\n\treturn clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0);\r\n}\r\n\r\nvec3 shade(vec3 point, Ray ray, float t, float material)\r\n{\r\n\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\r\n\r\n\tvec3 light = vec3(1.0, 5.0, 7.0);\r\n\tvec3 l = light - point;\r\n\r\n\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5;\r\n\r\n\tfloat falloff = 40.0 / pow(length(l) + EPSILON, 2.0);\r\n\tfloat shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0);\r\n\r\n\tfloat ao = evaluateAmbientOcclusion(point, normal);\r\n\r\n\tfloat facingRatio = dot(-ray.direction, normal);\r\n\r\n\tvec4 g = texture2D(gradientMap, vec2((material * .2) + .1, facingRatio));\r\n\r\n\tvec3 color = mix(g.rgb, vec3(diffuse), .15);\r\n\r\n\treturn color * (shadow * ao * falloff);\r\n}\r\n\r\nvoid main() \r\n{\r\n\t// Renormalize due to interpolation\r\n\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\r\n\r\n vec3 color;\r\n vec3 current = ray.position;\r\n\r\n float t = 0.0;\r\n\tfloat d = FAR_CLIP;\r\n float iterationCount = 0.0;\r\n float hitMaterial = 0.0;\r\n\r\n\tfor(int j = 0; j < MAX_ITERATIONS; j++)\r\n\t{\r\n\t\tevaluateSceneSDF(current, d, hitMaterial);\r\n\r\n\t\tif(d < EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t// More details in intersections (similar to a discontinuity reduction)\r\n\t// This GREATLY improves, for example, the gradient estimation for \r\n\t// big discontinuities such as box edges\r\n\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\r\n\t{\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\r\n\t\td = evaluateSceneSDFSimple(current);\r\n\t\t\r\n\t\tif(d <= 0.0)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\t}\r\n\r\n\tcolor = shade(current, ray, t, hitMaterial);\r\n\r\n\t// Gamma correction\r\n\tcolor = pow(color, vec3(.45454));\r\n\r\n\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\r\n\tcolor = mix(color, debugColor, u_debug);\r\n\r\n gl_FragColor = vec4(color, 1.0);\r\n}" /***/ }, /* 16 */ +/***/ function(module, exports) { + + module.exports = "// Note:\r\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\r\n// as I try to be as clear as possible for future reference\r\n\r\n#define MAX_GEOMETRY_COUNT 50\r\n#define FAR_CLIP 1000.0\r\n#define MAX_ITERATIONS 64\r\n#define SECONDARY_ITERATIONS 3\r\n#define EPSILON 0.005\r\n\r\n#define NORMAL_ESTIMATION_EPSILON .005\r\n\r\n#define AO_ITERATIONS 5\r\n#define AO_DELTA .1\r\n#define AO_DECAY .8\r\n\r\n// SHADOW PARAMETERS\r\n#define SHADOW_ITERATIONS 24\r\n#define SHADOW_SOFT_FACTOR 6.0\r\n#define SHADOW_EPSILON 0.00\r\n#define SHADOW_OFFSET .005\r\n\r\nstruct Ray {\r\n\tvec3 position;\r\n\tvec3 direction;\r\n};\r\n\r\nuniform mat4 u_viewProjectionMatrix;\r\nuniform vec3 u_cameraPosition;\r\n\r\nuniform mat4 u_transforms[MAX_GEOMETRY_COUNT];\r\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\r\nuniform int u_count;\r\n\r\nuniform float u_debug;\r\nuniform float time;\r\n\r\nvarying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\nvarying vec3 f_rayPos;\r\nvarying vec3 f_rayDir;\r\n\r\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\r\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\r\n{\r\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\r\n}\r\n\r\nvec3 debugIterations(float factor)\r\n{\r\n\tvec3 a = vec3(0.478, 0.500, 0.500);\r\n\tvec3 b = vec3(0.500);\r\n\tvec3 c = vec3(0.688, 0.748, 0.748);\r\n\tvec3 d = vec3(0.318, 0.588, 0.908);\r\n\r\n\treturn palette(factor, a, b, c, d);\r\n}\r\n\r\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\r\n// But they are tweaked for their threejs equivalents\r\nfloat sdSphere( vec3 p )\r\n{\r\n\treturn length(p) - 1.0;\r\n}\r\n\r\nfloat udBox( vec3 p)\r\n{\r\n\treturn length(max(abs(p) - vec3(.5), 0.0));\r\n}\r\n\r\n// TODO: build a parabola mixed with a plane to solve the \r\n// grazing angle/boundary iteration problem\r\nfloat sdPlane( vec3 p)\r\n{\r\n\treturn p.y;\r\n}\r\n\r\nfloat sdCappedCylinder( vec3 p)\r\n{\r\n vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0);\r\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\r\n}\r\n\r\nfloat sdTorus( vec3 p)\r\n{\r\n vec2 q = vec2(length(p.xz)-1.0,p.y);\r\n return length(q) - .2;\r\n}\r\n\r\nfloat udRoundBox( vec3 p, vec3 b, float r )\r\n{\r\n\treturn length(max(abs(p) - b, 0.0)) - r;\r\n}\r\n\r\nfloat sdCappedCone( in vec3 p)\r\n{\r\n\tp.y -= .25;\r\n vec2 q = vec2( length(p.xz), p.y );\r\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\r\n vec2 w = v - q;\r\n vec2 vv = vec2( dot(v,v), v.x*v.x );\r\n vec2 qv = vec2( dot(v,w), v.x*w.x );\r\n vec2 d = max(qv,0.0) * qv / vv;\r\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\r\n}\r\n\r\nRay getRay(vec3 origin, vec3 dir)\r\n{\r\n\tRay ray;\r\n\tray.position = origin;\r\n\tray.direction = dir;\r\n\treturn ray;\r\n}\r\n\r\nfloat evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform)\r\n{\r\n\tvec3 rep = vec3(18.0, 100.0, 18.0);\r\n\tpoint = mod(point + rep * .5, rep) - rep * .5;\r\n\tvec3 localPoint = (transform * vec4(point, 1.0)).xyz;\r\n\r\n if(geo.w == 0.0)\r\n \treturn udBox(localPoint);\r\n\telse if(geo.w == 1.0)\r\n\t\treturn sdSphere(localPoint);\r\n\telse if(geo.w == 2.0)\r\n\t\treturn sdCappedCone(localPoint * .5);\r\n\telse if(geo.w == 3.0)\r\n\t\treturn sdPlane(localPoint);\r\n\telse if(geo.w == 4.0)\r\n\t\treturn sdTorus(localPoint);\r\n\telse if(geo.w == 5.0)\r\n\t\treturn sdCappedCylinder(localPoint);\r\n\r\n\treturn FAR_CLIP;\r\n}\r\n\r\n// This method is useful for just the distance\r\nfloat evaluateSceneSDFSimple(vec3 point)\r\n{\r\n\tfloat minDistance = FAR_CLIP;\r\n\r\n \tfor (int i = 0; i < MAX_GEOMETRY_COUNT; i++) \r\n {\r\n if (i >= u_count)\r\n break;\r\n\r\n vec4 geo = u_buffer[i];\r\n mat4 transform = u_transforms[i];\r\n float d = evaluateGeometrySDF(point, geo, transform);\r\n minDistance = min(d, minDistance);\r\n }\r\n\r\n return minDistance;\r\n}\r\n\r\n// Assumes minDistance was initialized to FAR_CLIP\r\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\r\n{\t\r\n\tminDistance = FAR_CLIP;\r\n\r\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \r\n {\r\n if (i >= u_count)\r\n break;\r\n\r\n vec4 geo = u_buffer[i];\r\n mat4 transform = u_transforms[i];\r\n float d = evaluateGeometrySDF(point, geo, transform);\r\n \r\n minDistance = min(d, minDistance);\r\n }\r\n}\r\n\r\nvec3 estimateSceneGradient(vec3 point, float epsilon)\r\n{\r\n\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\r\n\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\r\n\r\n\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\r\n\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\r\n\r\n\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\r\n\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\r\n\r\n\treturn normalize(vec3(x,y,z));\r\n}\r\n\r\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\r\n// with tweaks\r\nfloat evaluateShadows(vec3 origin, vec3 toLight)\r\n{\r\n\tvec3 direction = toLight;\r\n\tfloat maxDistance = length(direction);\r\n\tdirection /= maxDistance;\r\n\r\n float t = SHADOW_EPSILON;\r\n float soft = .5;\r\n\r\n // WebGL doesnt like loops that cannot be easily unrolled\r\n\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\r\n\r\n\t\tif(d < SHADOW_EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\r\n\r\n\t\tif(t >= maxDistance)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t}\r\n\r\n\tsoft = clamp(soft * 2.0, 0.0, 1.0);\r\n\r\n\t// This is a mix of soft shadows and a fake AO\r\n\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\r\n}\r\n\r\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\r\n{\r\n\tfloat ao = 0.0;\r\n\tfloat delta = AO_DELTA;\r\n\tfloat decay = 1.0;\r\n\r\n\tfor(int i = 0; i < AO_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = float(i) * delta;\r\n\t\tdecay *= AO_DECAY;\r\n\t\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\r\n\t}\r\n\r\n\treturn clamp(1.0 - ao * .15, 0.0, 1.0);\r\n}\r\n\r\nvec3 shade(vec3 point, Ray ray, float t)\r\n{\r\n\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\r\n\r\n\tvec3 light = vec3(0.0, 4.0, 3.0);\r\n\tvec3 l = light - point;\r\n\r\n\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\r\n\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0);\r\n\tfloat shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l);\r\n\r\n\tfloat ao = evaluateAmbientOcclusion(point, normal);\r\n\r\n\treturn vec3(diffuse * falloff * shadow * ao);\r\n}\r\n\r\nvoid main() \r\n{\r\n\t// Renormalize due to interpolation\r\n\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\r\n\r\n vec3 color;\r\n vec3 current = ray.position;\r\n\r\n float t = 0.0;\r\n\tfloat d = FAR_CLIP;\r\n float iterationCount = 0.0;\r\n\r\n\tfor(int j = 0; j < MAX_ITERATIONS; j++)\r\n\t{\r\n\t\tevaluateSceneSDF(current, d);\r\n\r\n\t\tif(d < EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t// More details in intersections (similar to a discontinuity reduction)\r\n\t// This GREATLY improves, for example, the gradient estimation for \r\n\t// big discontinuities such as box edges\r\n\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\r\n\t{\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\r\n\t\td = evaluateSceneSDFSimple(current);\r\n\t\t\r\n\t\tif(d <= 0.0)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\t}\r\n\r\n\tcolor = shade(current, ray, t);\r\n\r\n\t// Gamma correction\r\n\tcolor = pow(color, vec3(.45454));\r\n\r\n\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\r\n\tcolor = mix(color, debugColor, u_debug);\r\n\r\n gl_FragColor = vec4(color, 1.0);\r\n}" + +/***/ }, +/* 17 */ /***/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__.p + "index.html"; /***/ }, -/* 17 */ +/* 18 */ /***/ function(module, exports) { module.exports = function( THREE ) { diff --git a/build/bundle.js.map b/build/bundle.js.map index a6b0409..f4526d3 100644 --- a/build/bundle.js.map +++ b/build/bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 4e0c33792ffe78e7a37e","webpack:///./src/main.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./src/proxy_geometry.js","webpack:///./~/three/build/three.js","webpack:///./src/rayMarching.js","webpack:///./~/three-effectcomposer/index.js","webpack:///./~/three-copyshader/index.js","webpack:///./~/three-effectcomposer/lib/renderpass.js","webpack:///./~/three-effectcomposer/lib/shaderpass.js","webpack:///./~/three-effectcomposer/lib/maskpass.js","webpack:///./~/three-effectcomposer/lib/clearmaskpass.js","webpack:///./src/glsl/pass-vert.glsl","webpack:///./src/glsl/rayMarch-frag.glsl","webpack:///./index.html","webpack:///./~/three-orbit-controls/index.js"],"names":["require","THREE","OrbitControls","BoxGeometry","SphereGeometry","ConeGeometry","PlaneGeometry","window","addEventListener","stats","setMode","domElement","style","position","left","top","document","body","appendChild","scene","Scene","camera","PerspectiveCamera","innerWidth","innerHeight","renderer","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","controls","enableDamping","enableZoom","rotateSpeed","zoomSpeed","panSpeed","aspect","updateProjectionMatrix","gui","GUI","options","strategy","debug","add","AxisHelper","DirectionalLight","proxyGeometry","boxMesh","Mesh","sphereMesh","coneMesh","planeMesh","rotateX","Math","PI","set","group","lookAt","Vector3","target","rayMarcher","tick","update","begin","render","buffer","end","requestAnimationFrame","ProxyMaterial","MeshLambertMaterial","color","PROXY_BUFFER_SIZE","ProxyGeometry","bounds","Group","_buffer","Float32Array","mesh","children","length","computeBuffer","remove","t","i","child","x","y","z","geometry","RayMarcher","EffectComposer","composer","shaderPass","ShaderPass","uniforms","u_buffer","type","value","undefined","u_count","u_debug","u_viewProjectionMatrix","Matrix4","u_cameraPosition","vertexShader","fragmentShader","renderToScreen","addPass","inverseProjectionMatrix","material","updateMatrix","getInverse","projectionMatrix","matrix","clone","multiply"],"mappings":"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ACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA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A;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAE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;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA,sBAAqB,mGAAmG,aAAa,2CAA2C,mBAAmB,SAAS,KAAK,4BAA4B,YAAY,gBAAgB,oCAAoC,WAAW,qCAAqC,gBAAgB,uBAAuB,iBAAiB,oCAAoC,eAAe,4BAA4B,uCAAuC,cAAc,iBAAiB;AAC1iB,mBAAkB,iBAAiB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;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yBAAwB,0BAA0B;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA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AEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAE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AEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IA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AEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AA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A;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAE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;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AA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A;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAqB,eAAe;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;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4CAA4C;;AAEzI;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,cAAc;;AAE7D,EAAC;;;;;;;;;;;;mBC9x0CuBiB,U;;AAFxB;;AAHA,KAAM1F,QAAQ,mBAAAD,CAAQ,CAAR,CAAd;AACA,KAAM4F,iBAAiB,mBAAA5F,CAAQ,CAAR,EAAgCC,KAAhC,CAAvB;;AAIe,UAAS0F,UAAT,CAAoBlE,QAApB,EAA8BN,KAA9B,EAAqCE,MAArC,EAA6C;AACxD,SAAIwE,WAAW,IAAID,cAAJ,CAAmBnE,QAAnB,CAAf;AACA,SAAIqE,aAAa,IAAIF,eAAeG,UAAnB,CAA8B;AAC3CC,mBAAU;AACNC,uBAAU;AACNC,uBAAM,KADA;AAENC,wBAAOC;AAFD,cADJ;AAKNC,sBAAS;AACLH,uBAAM,GADD;AAELC,wBAAO;AAFF,cALH;AASNG,sBAAS;AACLJ,uBAAM,GADD;AAELC,wBAAO;AAFF,cATH;AAaNI,qCAAyB;AACrBL,uBAAM,IADe;AAErBC,wBAAO,IAAIlG,MAAMuG,OAAV;AAFc,cAbnB;AAiBNC,+BAAmB;AACfP,uBAAM,IADS;AAEfC,wBAAO,IAAIlG,MAAM2D,OAAV,CAAkB,C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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4e0c33792ffe78e7a37e","require('file-loader?name=[name].[ext]!../index.html');\r\n\r\nconst THREE = require('three');\r\nconst OrbitControls = require('three-orbit-controls')(THREE)\r\n\r\nimport DAT from 'dat-gui'\r\nimport Stats from 'stats-js'\r\nimport ProxyGeometry, {ProxyMaterial} from './proxy_geometry'\r\nimport RayMarcher from './rayMarching'\r\n\r\nvar BoxGeometry = new THREE.BoxGeometry(1, 1, 1);\r\nvar SphereGeometry = new THREE.SphereGeometry(1, 32, 32);\r\nvar ConeGeometry = new THREE.ConeGeometry(1, 1);\r\nvar PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 );\r\n\r\nwindow.addEventListener('load', function() {\r\n var stats = new Stats();\r\n stats.setMode(1);\r\n stats.domElement.style.position = 'absolute';\r\n stats.domElement.style.left = '0px';\r\n stats.domElement.style.top = '0px';\r\n document.body.appendChild(stats.domElement);\r\n\r\n var scene = new THREE.Scene();\r\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\r\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n renderer.setClearColor(0x999999, 1.0);\r\n document.body.appendChild(renderer.domElement);\r\n\r\n var controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.enableZoom = true;\r\n controls.rotateSpeed = 0.3;\r\n controls.zoomSpeed = 1.0;\r\n controls.panSpeed = 2.0;\r\n\r\n window.addEventListener('resize', function() {\r\n camera.aspect = window.innerWidth / window.innerHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n });\r\n\r\n var gui = new DAT.GUI();\r\n\r\n var options = {\r\n strategy: 'Ray Marching',\r\n debug : false\r\n }\r\n\r\n gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching']);\r\n gui.add(options, 'debug');\r\n\r\n scene.add(new THREE.AxisHelper(20));\r\n scene.add(new THREE.DirectionalLight(0xffffff, 1));\r\n\r\n var proxyGeometry = new ProxyGeometry();\r\n\r\n var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial);\r\n var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial);\r\n var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial);\r\n var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial);\r\n\r\n \r\n planeMesh.rotateX(Math.PI * -.5);\r\n planeMesh.position.set(0, -1, 0);\r\n boxMesh.position.set(-3, 0, 0);\r\n coneMesh.position.set(3, 0, 0);\r\n\r\n proxyGeometry.add(boxMesh);\r\n proxyGeometry.add(sphereMesh);\r\n proxyGeometry.add(coneMesh);\r\n proxyGeometry.add(planeMesh);\r\n\r\n scene.add(proxyGeometry.group);\r\n\r\n camera.position.set(5, 10, 15);\r\n camera.lookAt(new THREE.Vector3(0,0,0));\r\n controls.target.set(0,0,0);\r\n \r\n var rayMarcher = new RayMarcher(renderer, scene, camera);\r\n\r\n (function tick() {\r\n controls.update();\r\n stats.begin();\r\n proxyGeometry.update();\r\n\r\n if (options.strategy === 'Proxy Geometry') {\r\n renderer.render(scene, camera);\r\n } else if (options.strategy === 'Ray Marching') {\r\n rayMarcher.render(proxyGeometry.buffer, camera, options);\r\n }\r\n stats.end();\r\n requestAnimationFrame(tick);\r\n })();\r\n});\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 1\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"

\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 2\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 3\n// module chunks = 0","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 4\n// module chunks = 0","const THREE = require('three');\r\n\r\nexport var ProxyMaterial = new THREE.MeshLambertMaterial({\r\n color: 0xff0000\r\n});\r\n\r\nexport const PROXY_BUFFER_SIZE = 4;\r\n\r\nexport default class ProxyGeometry {\r\n constructor(bounds) {\r\n this.group = new THREE.Group();\r\n this._buffer = new Float32Array();\r\n }\r\n\r\n add(mesh) {\r\n this.group.add(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n remove(mesh) {\r\n this.group.remove(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n update(t = 1/60) {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n // TODO: animate objects\r\n }\r\n this.computeBuffer();\r\n }\r\n\r\n computeBuffer() {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n this._buffer[PROXY_BUFFER_SIZE*i] = child.position.x;\r\n this._buffer[PROXY_BUFFER_SIZE*i+1] = child.position.y;\r\n this._buffer[PROXY_BUFFER_SIZE*i+2] = child.position.z;\r\n\r\n if (child.geometry instanceof THREE.BoxGeometry) {\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = 0;\r\n } else if (child.geometry instanceof THREE.SphereGeometry) {\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = 1;\r\n } else if (child.geometry instanceof THREE.ConeGeometry) {\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = 2;\r\n } else if (child.geometry instanceof THREE.PlaneGeometry) {\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = 3;\r\n }\r\n }\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/proxy_geometry.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tEventDispatcher.prototype = {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tvar REVISION = '84';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tvar textureId = 0;\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\t\tthis.x = ( m32 - m23 ) / s;\n\t\t\tthis.y = ( m13 - m31 ) / s;\n\t\t\tthis.z = ( m21 - m12 ) / s;\n\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\t\t\tthis.w = attribute.getW( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tWebGLRenderTarget.prototype = {\n\n\t\tconstructor: WebGLRenderTarget,\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\t\t\tvar w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ];\n\n\t\t\treturn this.divideScalar( w );\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCylindrical: function( c ) {\n\n\t\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\t\tthis.y = c.y;\n\t\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeShear: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, y, z, 0,\n\t\t\t\tx, 1, z, 0,\n\t\t\t\tx, y, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tif ( far === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"float 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}\\nvec2 ltcTextureCoords( const in GeometricContext geometry, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = (LUT_SIZE - 1.0)/LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5/LUT_SIZE;\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\\n\\tint config = 0;\\n\\tif ( L[0].z > 0.0 ) config += 1;\\n\\tif ( L[1].z > 0.0 ) config += 2;\\n\\tif ( L[2].z > 0.0 ) config += 4;\\n\\tif ( L[3].z > 0.0 ) config += 8;\\n\\tn = 0;\\n\\tif ( config == 0 ) {\\n\\t} else if ( config == 1 ) {\\n\\t\\tn = 3;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 2 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 3 ) {\\n\\t\\tn = 4;\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t\\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 4 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t} else if ( config == 5 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 6 ) {\\n\\t\\tn = 4;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 7 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 8 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = L[3];\\n\\t} else if ( config == 9 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t} else if ( config == 10 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 11 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 12 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t} else if ( config == 13 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = L[2];\\n\\t\\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t} else if ( config == 14 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t} else if ( config == 15 ) {\\n\\t\\tn = 4;\\n\\t}\\n\\tif ( n == 3 )\\n\\t\\tL[3] = L[0];\\n\\tif ( n == 4 )\\n\\t\\tL[4] = L[0];\\n}\\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\\n\\tfloat cosTheta = dot( v1, v2 );\\n\\tfloat theta = acos( cosTheta );\\n\\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\\n\\treturn res;\\n}\\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\\n\\trectPoints[0] = pos - halfWidth - halfHeight;\\n\\trectPoints[1] = pos + halfWidth - halfHeight;\\n\\trectPoints[2] = pos + halfWidth + halfHeight;\\n\\trectPoints[3] = pos - halfWidth + halfHeight;\\n}\\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tvec3 T1, T2;\\n\\tT1 = normalize(V - N * dot( V, N ));\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\\n\\tvec3 clippedRect[5];\\n\\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\\n\\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\\n\\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\\n\\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\\n\\tint n;\\n\\tclipQuadToHorizon(clippedRect, n);\\n\\tif ( n == 0 )\\n\\t\\treturn vec3( 0, 0, 0 );\\n\\tclippedRect[0] = normalize( clippedRect[0] );\\n\\tclippedRect[1] = normalize( clippedRect[1] );\\n\\tclippedRect[2] = normalize( clippedRect[2] );\\n\\tclippedRect[3] = normalize( clippedRect[3] );\\n\\tclippedRect[4] = normalize( clippedRect[4] );\\n\\tfloat sum = 0.0;\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\\n\\tif (n >= 4)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\\n\\tif (n == 5)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\\n\\tsum = max( 0.0, sum );\\n\\tvec3 Lo_i = vec3( sum, sum, sum );\\n\\treturn Lo_i;\\n}\\nvec3 Rect_Area_Light_Specular_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\\n\\t\\tconst in float roughness,\\n\\t\\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tvec2 uv = ltcTextureCoords( geometry, roughness );\\n\\tvec4 brdfLtcApproxParams, t;\\n\\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\\n\\tt = texture2D( ltcMat, uv );\\n\\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\\n\\tmat3 brdfLtcApproxMat = mat3(\\n\\t\\tvec3( 1, 0, t.y ),\\n\\t\\tvec3( 0, t.z, 0 ),\\n\\t\\tvec3( t.w, 0, t.x )\\n\\t);\\n\\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\\n\\tspecularReflectance *= brdfLtcScalar;\\n\\treturn specularReflectance;\\n}\\nvec3 Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tmat3 diffuseBrdfMat = mat3(1);\\n\\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\\n\\treturn diffuseReflectance;\\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\";\n\n\tvar 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\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, 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#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\n\tvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\n\tvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar 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};\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\\n\\t}\\n#endif\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff;\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar 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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#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\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar 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 ) * flipNormal;\\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\";\n\n\tvar 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\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar 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\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\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}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\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\\t#include \\n}\\n\";\n\n\tvar 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 \\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\\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\";\n\n\tvar 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 \\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\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\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\\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\";\n\n\tvar 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 \\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\";\n\n\tvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\n\tvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\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\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\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#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\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_vertex: fog_vertex,\n\t\tfog_pars_vertex: fog_pars_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\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 ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tgradientmap: {\n\n\t\t\tgradientMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} },\n\n\t\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\t\trectAreaLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\twidth: {},\n\t\t\t\theight: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.gradientmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tscale: { value: 1 },\n\t\t\t\t\tdashSize: { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\t\t\t\tlightPos: { value: new Vector3() }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tShaderLib.standard.uniforms,\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyMatrix4( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( fog.isFog ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar materialId = 0;\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tvar x = attribute.getX( i );\n\t\t\t\tvar y = attribute.getY( i );\n\t\t\t\tvar z = attribute.getZ( i );\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\treturn this.expandByObject( object );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function expandByObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box;\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tif ( box === undefined ) box = new Box3(); // see #10547\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( light && light.isPointLight ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\t// TODO (abelnation / sam-g-steel): is this needed?\n\t\t\t\tif (shadow && shadow.isRectAreaLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material && material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tvar object3DId = 0;\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\n\t\tthis.onBeforeRender = function () {};\n\t\tthis.onAfterRender = function () {};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject3D.prototype = {\n\n\t\tconstructor: Object3D,\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.layers.mask = source.layers.mask;\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\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\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int8Array( array ), itemSize );\n\n\t}\n\n\tInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\n\tfunction Uint8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8Array( array ), itemSize );\n\n\t}\n\n\tUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\n\tfunction Uint8ClampedBufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\n\tfunction Int16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int16Array( array ), itemSize );\n\n\t}\n\n\tInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\n\tfunction Uint16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint16Array( array ), itemSize );\n\n\t}\n\n\tUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\n\tfunction Int32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int32Array( array ), itemSize );\n\n\t}\n\n\tInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\n\tfunction Uint32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint32Array( array ), itemSize );\n\n\t}\n\n\tUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\n\tfunction Float32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float32Array( array ), itemSize );\n\n\t}\n\n\tFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\n\tfunction Float64BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float64Array( array ), itemSize );\n\n\t}\n\n\tFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, {\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex = undefined;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t// http://stackoverflow.com/questions/1669190/javascript-min-max-array-values/13440842#13440842\n\n\tfunction arrayMax( array ) {\n\n\t\tvar length = array.length, max = - Infinity;\n\n\t\twhile ( length -- ) {\n\n\t\t\tif ( array[ length ] > max ) {\n\n\t\t\t\tmax = array[ length ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn max;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tvar count = 0;\n\tfunction GeometryIdCount() { return count++; }\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tGeometry.prototype = {\n\n\t\tconstructor: Geometry,\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( ( geometry && geometry.isGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( ( mesh && mesh.isMesh ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar i, il, j, jl, k, kl;\n\n\t\t\t// reset\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.colors = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [[]];\n\t\t\tthis.morphTargets = [];\n\t\t\tthis.morphNormals = [];\n\t\t\tthis.skinWeights = [];\n\t\t\tthis.skinIndices = [];\n\t\t\tthis.lineDistances = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// vertices\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// face vertex uvs\n\n\t\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargets = source.morphTargets;\n\n\t\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = {};\n\t\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t\t// vertices\n\n\t\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// normals\n\n\t\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t\t// morph normals\n\n\t\t\tvar morphNormals = source.morphNormals;\n\n\t\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphNormal = {};\n\n\t\t\t\t// vertex normals\n\n\t\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// face normals\n\n\t\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t\t}\n\n\t\t\t// skin weights\n\n\t\t\tvar skinWeights = source.skinWeights;\n\n\t\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// skin indices\n\n\t\t\tvar skinIndices = source.skinIndices;\n\n\t\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// line distances\n\n\t\t\tvar lineDistances = source.lineDistances;\n\n\t\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// update flags\n\n\t\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tBufferGeometry.prototype = {\n\n\t\tconstructor: BufferGeometry,\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tif ( Array.isArray( index ) ) {\n\n\t\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tthis.index = index;\n\n\t\t\t}\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh ) {\n\n\t\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar position = this.attributes.position;\n\n\t\t\t\tif ( position ) {\n\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( ( geometry && geometry.isBufferGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// index\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tvar morphAttributes = source.morphAttributes;\n\n\t\t\tfor ( name in morphAttributes ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// draw range\n\n\t\t\tthis.drawRange.start = source.drawRange.start;\n\t\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uv ) {\n\n\t\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar intersection;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = ( material && material.isMultiMaterial );\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar uvs;\n\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar numberOfVertices = 0;\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth = width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar ix, iy;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar ix, iy;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else if ( index.array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\t\t\t\tsize = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t \n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\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 );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshToonMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( map.isTexture ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tvar type = gl.FLOAT;\n\t\t\tvar array = data.array;\n\n\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\ttype = gl.FLOAT;\n\n\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\ttype = gl.SHORT;\n\n\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\ttype = gl.INT;\n\n\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\ttype = gl.BYTE;\n\n\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t\t}\n\n\t\t\tattributeProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\t\tattributeProperties.type = type;\n\t\t\tattributeProperties.version = data.version;\n\n\t\t\tdata.onUploadCallback();\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\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.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getAttributeProperties( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data );\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute );\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetAttributeProperties: getAttributeProperties,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\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 );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar version = parseFloat( /^WebGL\\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );\n\t\tvar lineWidthAvailable = parseFloat( version ) >= 1.0;\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\t\t\tdepthBuffer.setClear( 1 );\n\t\t\tstencilBuffer.setClear( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t\t// internal state cache\n\n\t\t\t_currentProgram = null,\n\t\t\t_currentRenderTarget = null,\n\t\t\t_currentFramebuffer = null,\n\t\t\t_currentMaterialId = - 1,\n\t\t\t_currentGeometryProgram = '',\n\t\t\t_currentCamera = null,\n\n\t\t\t_currentScissor = new Vector4(),\n\t\t\t_currentScissorTest = null,\n\n\t\t\t_currentViewport = new Vector4(),\n\n\t\t\t//\n\n\t\t\t_usedTextureUnits = 0,\n\n\t\t\t//\n\n\t\t\t_clearColor = new Color( 0x000000 ),\n\t\t\t_clearAlpha = 0,\n\n\t\t\t_width = _canvas.width,\n\t\t\t_height = _canvas.height,\n\n\t\t\t_pixelRatio = 1,\n\n\t\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissorTest = false,\n\n\t\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t\t// frustum\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t// clipping\n\n\t\t\t_clipping = new WebGLClipping(),\n\t\t\t_clippingEnabled = false,\n\t\t\t_localClippingEnabled = false,\n\n\t\t\t_sphere = new Sphere(),\n\n\t\t\t// camera matrices cache\n\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_vector3 = new Vector3(),\n\t\t\t_matrix4 = new Matrix4(),\n\t\t\t_matrix42 = new Matrix4(),\n\n\t\t\t// light arrays cache\n\n\t\t\t_lights = {\n\n\t\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\trectArea: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\t\tshadows: []\n\n\t\t\t},\n\n\t\t\t// info\n\n\t\t\t_infoRender = {\n\n\t\t\t\tcalls: 0,\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0,\n\t\t\t\tpoints: 0\n\n\t\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundPlaneCamera, backgroundPlaneMesh;\n\t\tvar backgroundBoxCamera, backgroundBoxMesh;\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\t\tmaterial.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\t\tvar attributeProperties = objects.getAttributeProperties( geometryAttribute );\n\n\t\t\t\t\t\tvar buffer = attributeProperties.__webglBuffer;\n\t\t\t\t\t\tvar type = attributeProperties.type;\n\t\t\t\t\t\tvar bytesPerElement = attributeProperties.bytesPerElement;\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tstate.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tif ( backgroundBoxCamera === undefined ) {\n\n\t\t\t\t\tbackgroundBoxCamera = new PerspectiveCamera();\n\n\t\t\t\t\tbackgroundBoxMesh = new Mesh(\n\t\t\t\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\t\tfog: false\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );\n\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tif ( backgroundPlaneCamera === undefined ) {\n\n\t\t\t\t\tbackgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\t\tbackgroundPlaneMesh = new Mesh(\n\t\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t\t! material.isRawShaderMaterial ||\n\t\t\t\tmaterial.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.rectAreaLights.value = _lights.rectArea;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isMeshNormalMaterial ||\n\t\t\t\t\tmaterial.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// RectAreaLight Texture\n\t\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\t\tif ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE;\n\t\t\t\tif ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE;\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t\tif ( material.gradientMap ) {\n\n\t\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\t\tr = 0, g = 0, b = 0,\n\t\t\t\tcolor,\n\t\t\t\tintensity,\n\t\t\t\tdistance,\n\t\t\t\tshadowMap,\n\n\t\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\trectAreaLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\t// (a) intensity controls irradiance of entire light\n\t\t\t\t\tuniforms.color\n\t\t\t\t\t\t.copy( color )\n\t\t\t\t\t\t.multiplyScalar( intensity / ( light.width * light.height ) );\n\n\t\t\t\t\t// (b) intensity controls the radiance per light area\n\t\t\t\t\t// uniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\t\t_matrix42.identity();\n\t\t\t\t\t_matrix4.copy( light.matrixWorld );\n\t\t\t\t\t_matrix4.premultiply( viewMatrix );\n\t\t\t\t\t_matrix42.extractRotation( _matrix4 );\n\n\t\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\t\tuniforms.halfWidth.applyMatrix4( _matrix42 );\n\t\t\t\t\tuniforms.halfHeight.applyMatrix4( _matrix42 );\n\n\t\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\t\t_lights.rectArea[ rectAreaLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.rectArea.length = rectAreaLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t// TODO (sam-g-steel) why aren't we using join\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar i, j, l, o, ol;\n\t\tvar edge = [ 0, 0 ], edges = {}, e;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\t\tvar vertex;\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tvar position, indices, groups;\n\t\t\tvar group, start, count;\n\t\t\tvar index1, index2;\n\n\t\t\tvertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\t\t\t\tindices = geometry.index;\n\t\t\t\tgroups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.count );\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\t\tstart = group.start;\n\t\t\t\t\tcount = group.count;\n\n\t\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices.getX( i + j );\n\t\t\t\t\t\t\tedge[ 1 ] = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( key in edges ) {\n\n\t\t\t\t\te = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\n\t\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tvar v = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tvar u = j / slices;\n\n\t\t\t\tvar p = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\tvar a = i * sliceCount + j;\n\t\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tvar azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\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\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\t r, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, j;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\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.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // curve to extrude shape along\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( ( font && font.isFont ) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar ix, iy;\n\n\t\tvar index = 0;\n\t\tvar grid = [];\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = iy / heightSegments;\n\n\t\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tvar u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// some helper variables\n\n\t\tvar segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t */\n\n\tfunction ShapeGeometry( shapes, curveSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tcurveSegments = curveSegments || 12;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar groupStart = 0;\n\t\tvar groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tvar i, l, shapeHole;\n\n\t\t\tvar indexOffset = vertices.length / 3;\n\t\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\t\tvar shapeVertices = points.shape;\n\t\t\tvar shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t\t// also check if holes are in the opposite direction\n\n\t\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\t\tvar edge = [ 0, 0 ], edges = {};\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t\t// prepare source geometry\n\n\t\tvar geometry2;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar sourceVertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tkey = edge.toString();\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\tvar e = edges[ key ];\n\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar index = 0;\n\t\tvar indexOffset = 0;\n\t\tvar indexArray = [];\n\t\tvar halfHeight = height / 2;\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\n\t\t\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, s;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tShapeBufferGeometry: ShapeBufferGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tBoxGeometry: BoxGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = Array.isArray( materials ) ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author takahirox / http://github.com/takahirox\n\t *\n\t * parameters = {\n\t * gradientMap: new THREE.Texture( )\n\t * }\n\t */\n\n\tfunction MeshToonMaterial( parameters ) {\n\n\t\tMeshPhongMaterial.call( this );\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.gradientMap = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\n\tMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\n\tMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\n\tMeshToonMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshToonMaterial: MeshToonMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FileLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FileLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { type: mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMimeType: function ( value ) {\n\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tfunction DataTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( DataTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\t\timage.addEventListener( 'load', function () {\n\n\t\t\t\tCache.add( url, this );\n\n\t\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\t/*\n\t\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t\t}, false );\n\t\t\t*/\n\n\t\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\timage.src = url;\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function ( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function () {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function () {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function ( timeOffset ) {\n\n\t\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function ( timeScale ) {\n\n\t\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function ( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== - 1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function () {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif ( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function () {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0; m !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar BlendingMode = {\n\t\t\t\tNoBlending: NoBlending,\n\t\t\t\tNormalBlending: NormalBlending,\n\t\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\t\tCustomBlending: CustomBlending\n\t\t\t};\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\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.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = null;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tscope.parse( json, onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tvar TextureMapping = {\n\t\t\t\tUVMapping: UVMapping,\n\t\t\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\t\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\t\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\t\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\t\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\t\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\t\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t\t\t};\n\n\t\t\tvar TextureWrapping = {\n\t\t\t\tRepeatWrapping: RepeatWrapping,\n\t\t\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\t\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t\t\t};\n\n\t\t\tvar TextureFilter = {\n\t\t\t\tNearestFilter: NearestFilter,\n\t\t\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\t\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\t\t\tLinearFilter: LinearFilter,\n\t\t\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\t\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t\t\t};\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.' );\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Bezier Curves formulas obtained from\n\t * http://en.wikipedia.org/wiki/Bézier_curve\n\t */\n\n\tfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\tvar t2 = t * t;\n\t\tvar t3 = t * t2;\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t}\n\n\t//\n\n\tfunction QuadraticBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * p;\n\n\t}\n\n\tfunction QuadraticBezierP1( t, p ) {\n\n\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t}\n\n\tfunction QuadraticBezierP2( t, p ) {\n\n\t\treturn t * t * p;\n\n\t}\n\n\tfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\t\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\t\tQuadraticBezierP2( t, p2 );\n\n\t}\n\n\t//\n\n\tfunction CubicBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * k * p;\n\n\t}\n\n\tfunction CubicBezierP1( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn 3 * k * k * t * p;\n\n\t}\n\n\tfunction CubicBezierP2( t, p ) {\n\n\t\treturn 3 * ( 1 - t ) * t * t * p;\n\n\t}\n\n\tfunction CubicBezierP3( t, p ) {\n\n\t\treturn t * t * t * p;\n\n\t}\n\n\tfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\t\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\t\tCubicBezierP3( t, p3 );\n\n\t}\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.CatmullRomCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\n\n\t\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function ( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\treturn new Vector2(\n\t\t\tCatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),\n\t\t\tCatmullRom( weight, point0.y, point1.y, point2.y, point3.y )\n\t\t);\n\n\t};\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector2(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector2(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\t **/\n\n\tfunction ShapePath() {\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tShapePath.prototype = {\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push( this.currentPath );\n\t\t\tthis.currentPath.moveTo( x, y );\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tthis.currentPath.lineTo( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts ) {\n\n\t\t\tthis.currentPath.splineThru( pts );\n\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\t\toffsetX = 0;\n\t\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [];\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tvar AudioContext = {\n\n\t\tgetContext: function () {\n\n\t\t\tif ( context === undefined ) {\n\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t\t}\n\n\t\t\treturn context;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = AudioContext.getContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction RectAreaLight ( color, intensity, width, height ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.position.set( 0, 1, 0 );\n\t\tthis.updateMatrix();\n\n\t\tthis.width = ( width !== undefined ) ? width : 10;\n\t\tthis.height = ( height !== undefined ) ? height : 10;\n\n\t\t// TODO (abelnation): distance/decay\n\n\t\t// TODO (abelnation): update method for RectAreaLight to update transform to lookat target\n\n\t\t// TODO (abelnation): shadows\n\t\t// this.shadow = new THREE.RectAreaLightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\t// TODO (abelnation): RectAreaLight update when light shape is changed\n\tRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: RectAreaLight,\n\n\t\tisRectAreaLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\t// this.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.loop = false;\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.buffer;\n\t\t\tsource.loop = this.loop;\n\t\t\tsource.onended = this.onEnded.bind( this );\n\t\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\t\tsource.start( 0, this.startTime );\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.loop = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.loop = this.loop;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tbufferType = Array;\n\t\t\t\tmixFunction = this._select;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:[\\w-]+[\\/:])*)([\\w-]+)?(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?\\.([\\w-]+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ],\n\t\t\t\t\tknownObject = undefined;\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis._loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tAnimationMixer.prototype = {\n\n\t\tconstructor: AnimationMixer,\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function () {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function ( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function () {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function ( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function ( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function ( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function ( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function ( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function () {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function ( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function ( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function () {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tUniform.prototype.clone = function () {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n\t *\n\t */\n\n\tfunction Cylindrical( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tCylindrical.prototype = {\n\n\t\tconstructor: Cylindrical,\n\n\t\tset: function ( radius, theta, y ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.theta = theta;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.theta = other.theta;\n\t\t\tthis.y = other.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\t\tthis.y = vec3.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = 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} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar color1 = new Color( 0, 0, 1 );\n\t\tvar color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( object && object.isBone ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar boneMatrix = new Matrix4();\n\t\tvar matrixWorldInv = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\t\tfor ( var i = 0, j = 0; i < this.bones.length; i ++ ) {\n\n\t\t\t\tvar bone = this.bones[ i ];\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tj += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t * @author Mugen87 / http://github.com/Mugen87\n\t */\n\n\tfunction RectAreaLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar materialFront = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false\n\t\t} );\n\n\t\tvar materialBack = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false,\n\t\t\twireframe: true\n\t\t} );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 6 * 3 ), 3 ) );\n\n\t\t// shows the \"front\" of the light, e.g. where light comes from\n\n\t\tthis.add( new Mesh( geometry, materialFront ) );\n\n\t\t// shows the \"back\" of the light, which does not emit light\n\n\t\tthis.add( new Mesh( geometry, materialBack ) );\n\n\t\tthis.update();\n\n\t}\n\n\tRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\n\tRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\n\tRectAreaLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\t\tthis.children[ 1 ].geometry.dispose();\n\t\tthis.children[ 1 ].material.dispose();\n\n\t};\n\n\tRectAreaLightHelper.prototype.update = function () {\n\n\t\tvar vector1 = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh1 = this.children[ 0 ];\n\t\t\tvar mesh2 = this.children[ 1 ];\n\n\t\t\tif ( this.light.target ) {\n\n\t\t\t\tvector1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\t\tvar lookVec = vector2.clone().sub( vector1 );\n\t\t\t\tmesh1.lookAt( lookVec );\n\t\t\t\tmesh2.lookAt( lookVec );\n\n\t\t\t}\n\n\t\t\t// update materials\n\n\t\t\tmesh1.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tmesh2.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// calculate new dimensions of the helper\n\n\t\t\tvar hx = this.light.width * 0.5;\n\t\t\tvar hy = this.light.height * 0.5;\n\n\t\t\t// because the buffer attribute is shared over both geometries, we only have to update once\n\n\t\t\tvar position = mesh1.geometry.getAttribute( 'position' );\n\t\t\tvar array = position.array;\n\n\t\t\t// first face\n\n\t\t\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\t\t\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\t\t\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\n\t\t\t// second face\n\n\t\t\tarray[ 9 ] = - hx; array[ 10 ] = hy; array[ 11 ] = 0;\n\t\t\tarray[ 12 ] = - hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\t\t\tarray[ 15 ] = hx; array[ 16 ] = - hy; array[ 17 ] = 0;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction HemisphereLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } );\n\n\t\tvar position = geometry.getAttribute( 'position' );\n\t\tvar colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar color1 = new Color();\n\t\tvar color2 = new Color();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh = this.children[ 0 ];\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tcolor2.copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tsize = size || 10;\n\t\tdivisions = divisions || 10;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = size / divisions;\n\t\tvar halfSize = size / 2;\n\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author Hectate / http://www.github.com/Hectate\n\t */\n\n\tfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\t\tradius = radius || 10;\n\t\tradials = radials || 16;\n\t\tcircles = circles || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar x, z;\n\t\tvar v, i, j, r, color;\n\n\t\t// create the radials\n\n\t\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * radius;\n\t\t\tz = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tr = radius - ( radius / circles * i );\n\n\t\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tPolarGridHelper.prototype = Object.create( LineSegments.prototype );\n\tPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new BufferGeometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar colorFrustum = new Color( 0xffaa00 );\n\t\tvar colorCone = new Color( 0xff0000 );\n\t\tvar colorUp = new Color( 0x00aaff );\n\t\tvar colorTarget = new Color( 0xffffff );\n\t\tvar colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", colorFrustum );\n\t\taddLine( \"n2\", \"n4\", colorFrustum );\n\t\taddLine( \"n4\", \"n3\", colorFrustum );\n\t\taddLine( \"n3\", \"n1\", colorFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", colorFrustum );\n\t\taddLine( \"f2\", \"f4\", colorFrustum );\n\t\taddLine( \"f4\", \"f3\", colorFrustum );\n\t\taddLine( \"f3\", \"f1\", colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", colorFrustum );\n\t\taddLine( \"n2\", \"f2\", colorFrustum );\n\t\taddLine( \"n3\", \"f3\", colorFrustum );\n\t\taddLine( \"n4\", \"f4\", colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", colorCone );\n\t\taddLine( \"p\", \"n2\", colorCone );\n\t\taddLine( \"p\", \"n3\", colorCone );\n\t\taddLine( \"p\", \"n4\", colorCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", colorUp );\n\t\taddLine( \"u2\", \"u3\", colorUp );\n\t\taddLine( \"u3\", \"u1\", colorUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", colorTarget );\n\t\taddLine( \"p\", \"c\", colorCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", colorCross );\n\t\taddLine( \"cn3\", \"cn4\", colorCross );\n\n\t\taddLine( \"cf1\", \"cf2\", colorCross );\n\t\taddLine( \"cf3\", \"cf4\", colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\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 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( object && object.isBox3 ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry;\n\tvar coneGeometry;\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( lineGeometry === undefined ) {\n\n\t\t\tlineGeometry = new BufferGeometry();\n\t\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t];\n\n\t\tvar colors = [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\n\t/*\n\tBased on an optimized c++ solution in\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t - http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tfunction CubicPoly() {\n\n\t\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tfunction init( x0, x1, t0, t1 ) {\n\n\t\t\tc0 = x0;\n\t\t\tc1 = t0;\n\t\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t\t},\n\n\t\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\t\tt1 *= dt1;\n\t\t\t\tt2 *= dt1;\n\n\t\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t\t},\n\n\t\t\tcalc: function ( t ) {\n\n\t\t\t\tvar t2 = t * t;\n\t\t\t\tvar t3 = t2 * t;\n\t\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar tmp = new Vector3();\n\tvar px = new CubicPoly();\n\tvar py = new CubicPoly();\n\tvar pz = new CubicPoly();\n\n\tfunction CatmullRomCurve3( p /* array of Vector3 */ ) {\n\n\t\tthis.points = p || [];\n\t\tthis.closed = false;\n\n\t}\n\n\tCatmullRomCurve3.prototype = Object.create( Curve.prototype );\n\tCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\n\tCatmullRomCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar l = points.length;\n\n\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\tvar point = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tp1 = points[ intPoint % l ];\n\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t}\n\n\t\treturn new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );\n\n\t};\n\n\tfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve3.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\n\tCubicBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector3(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\n\tQuadraticBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector3(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t};\n\n\tfunction LineCurve3( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve3.prototype = Object.create( Curve.prototype );\n\tLineCurve3.prototype.constructor = LineCurve3;\n\n\tLineCurve3.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar vector = new Vector3();\n\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\tvector.multiplyScalar( t );\n\t\tvector.add( this.v1 );\n\n\t\treturn vector;\n\n\t};\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction MeshFaceMaterial( materials ) {\n\n\t\tconsole.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' );\n\t\treturn new MultiMaterial( materials );\n\n\t}\n\n\tfunction PointCloud( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction Particle( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\treturn new Sprite( material );\n\n\t}\n\n\tfunction ParticleSystem( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction PointCloudMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleBasicMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleSystemMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction Vertex( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\n\t}\n\n\t//\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\treturn new Int8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\treturn new Uint8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\treturn new Int16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\treturn new Uint16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\treturn new Int32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\treturn new Uint32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\treturn new Float64BufferAttribute( array, itemSize );\n\n\t}\n\n\t//\n\n\tCurve.create = function ( construct, getPoint ) {\n\n\t\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\t\tconstruct.prototype = Object.create( Curve.prototype );\n\t\tconstruct.prototype.constructor = construct;\n\t\tconstruct.prototype.getPoint = getPoint;\n\n\t\treturn construct;\n\n\t};\n\n\t//\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction SplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction Spline( points ) {\n\n\t\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\tObject.assign( Spline.prototype, {\n\n\t\tinitFromArray: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t\t},\n\t\tgetControlPointsArray: function ( optionalTarget ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t\t},\n\t\treparametrizeByArcLength: function ( samplingCoef ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\t//\n\tfunction BoundingBoxHelper( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\treturn new BoxHelper( object, color );\n\n\t}\n\n\tfunction EdgesHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\tfunction WireframeHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\t//\n\n\tfunction XHRLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\treturn new FileLoader( manager );\n\n\t}\n\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\treturn new DataTextureLoader( manager );\n\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tLine3.prototype.center = function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t};\n\n\t_Math.random16 = function () {\n\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t};\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\textractPosition: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\n\t\t},\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\trotateAxis: function ( v ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\ttranslate: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t\t},\n\t\trotateX: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t\t},\n\t\trotateY: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t\t},\n\t\trotateZ: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t\t},\n\t\trotateByAxis: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t\t},\n\t\tmakeFrustum: function( left, right, bottom, top, near, far ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t\t}\n\n\t} );\n\n\tPlane.prototype.isIntersectionLine = function ( line ) {\n\n\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\treturn this.intersectsLine( line );\n\n\t};\n\n\tQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t};\n\n\tObject.assign( Ray.prototype, {\n\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\n\t\textrude: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tsetEulerFromRotationMatrix: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t\t},\n\t\tapplyProjection: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\t\treturn this.applyMatrix4( m );\n\n\t\t},\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tGeometry.prototype.computeTangents = function () {\n\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t};\n\n\tObject.assign( Object3D.prototype, {\n\n\t\tgetChildByName: function ( name ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\n\t\t},\n\t\trenderDepth: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\n\t\teulerOrder: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\n\t\tobjects: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\n\t\tlength: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\t\treturn this.array.length;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\n\t\taddIndex: function ( index ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\t\tif ( indexOffset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\n\t\t},\n\t\tclearDrawCalls: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\n\t\t},\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t\t},\n\t\tcomputeOffsets: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\n\t\tdynamic: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\n\t\twrapAround: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\t\tmetal: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\n\t\tderivatives: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\n\t\tsupportsFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\t\treturn this.capabilities.vertexTextures;\n\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\n\t\t},\n\t\tinitMaterial: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t\t},\n\t\taddPrePlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t\t},\n\t\taddPostPlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t\t},\n\t\tupdateShadowMap: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.enabled;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.cullFace;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\n\t\tcullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\t\twrapS: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tAudio.prototype.load = function ( file ) {\n\n\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\tvar scope = this;\n\t\tvar audioLoader = new AudioLoader();\n\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\tscope.setBuffer( buffer );\n\n\t\t} );\n\t\treturn this;\n\n\t};\n\n\tAudioAnalyser.prototype.getData = function () {\n\n\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\treturn this.getFrequencyData();\n\n\t};\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector() {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function () {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer() {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.Texture = Texture;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.FileLoader = FileLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.RectAreaLight = RectAreaLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.AudioContext = AudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Cylindrical = Cylindrical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.RectAreaLightHelper = RectAreaLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.PolarGridHelper = PolarGridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.Path = Path;\n\texports.ShapePath = ShapePath;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ShapeBufferGeometry = ShapeBufferGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshToonMaterial = MeshToonMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.Float64BufferAttribute = Float64BufferAttribute;\n\texports.Float32BufferAttribute = Float32BufferAttribute;\n\texports.Uint32BufferAttribute = Uint32BufferAttribute;\n\texports.Int32BufferAttribute = Int32BufferAttribute;\n\texports.Uint16BufferAttribute = Uint16BufferAttribute;\n\texports.Int16BufferAttribute = Int16BufferAttribute;\n\texports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\n\texports.Uint8BufferAttribute = Uint8BufferAttribute;\n\texports.Int8BufferAttribute = Int8BufferAttribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MeshFaceMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Particle;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.Spline = Spline;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.XHRLoader = XHRLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 6\n// module chunks = 0","const THREE = require('three');\r\nconst EffectComposer = require('three-effectcomposer')(THREE)\r\n\r\nimport {PROXY_BUFFER_SIZE} from './proxy_geometry'\r\n\r\nexport default function RayMarcher(renderer, scene, camera) {\r\n var composer = new EffectComposer(renderer);\r\n var shaderPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n u_buffer: {\r\n type: '4fv',\r\n value: undefined\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/rayMarch-frag.glsl')\r\n });\r\n shaderPass.renderToScreen = true;\r\n composer.addPass(shaderPass);\r\n\r\n var inverseProjectionMatrix = new THREE.Matrix4();\r\n\r\n return {\r\n render: function(buffer, camera, options) {\r\n\r\n shaderPass.material.uniforms.u_buffer.value = buffer;\r\n shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE;\r\n shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n\r\n camera.updateMatrix();\r\n camera.updateProjectionMatrix();\r\n\r\n inverseProjectionMatrix.getInverse(camera.projectionMatrix);\r\n shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n composer.render();\r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/rayMarching.js","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n var CopyShader = EffectComposer.CopyShader = require('three-copyshader')\n , RenderPass = EffectComposer.RenderPass = require('./lib/renderpass')(THREE)\n , ShaderPass = EffectComposer.ShaderPass = require('./lib/shaderpass')(THREE, EffectComposer)\n , MaskPass = EffectComposer.MaskPass = require('./lib/maskpass')(THREE)\n , ClearMaskPass = EffectComposer.ClearMaskPass = require('./lib/clearmaskpass')(THREE)\n\n function EffectComposer( renderer, renderTarget ) {\n this.renderer = renderer;\n\n if ( renderTarget === undefined ) {\n var width = window.innerWidth || 1;\n var height = window.innerHeight || 1;\n var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\n renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n this.passes = [];\n\n this.copyPass = new ShaderPass( CopyShader );\n };\n\n EffectComposer.prototype = {\n swapBuffers: function() {\n\n var tmp = this.readBuffer;\n this.readBuffer = this.writeBuffer;\n this.writeBuffer = tmp;\n\n },\n\n addPass: function ( pass ) {\n\n this.passes.push( pass );\n\n },\n\n insertPass: function ( pass, index ) {\n\n this.passes.splice( index, 0, pass );\n\n },\n\n render: function ( delta ) {\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n var maskActive = false;\n\n var pass, i, il = this.passes.length;\n\n for ( i = 0; i < il; i ++ ) {\n\n pass = this.passes[ i ];\n\n if ( !pass.enabled ) continue;\n\n pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n if ( pass.needsSwap ) {\n\n if ( maskActive ) {\n\n var context = this.renderer.context;\n\n context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n }\n\n this.swapBuffers();\n\n }\n\n if ( pass instanceof MaskPass ) {\n\n maskActive = true;\n\n } else if ( pass instanceof ClearMaskPass ) {\n\n maskActive = false;\n\n }\n\n }\n\n },\n\n reset: function ( renderTarget ) {\n\n if ( renderTarget === undefined ) {\n\n renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = window.innerWidth;\n renderTarget.height = window.innerHeight;\n\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n },\n\n setSize: function ( width, height ) {\n\n var renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = width;\n renderTarget.height = height;\n\n this.reset( renderTarget );\n\n }\n\n };\n\n // shared ortho camera\n\n EffectComposer.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n EffectComposer.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\n EffectComposer.scene = new THREE.Scene();\n EffectComposer.scene.add( EffectComposer.quad );\n\n return EffectComposer\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/index.js\n// module id = 8\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nmodule.exports = {\n uniforms: {\n \"tDiffuse\": { type: \"t\", value: null },\n \"opacity\": { type: \"f\", value: 1.0 }\n },\n vertexShader: [\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vUv = uv;\",\n \"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n \"}\"\n ].join(\"\\n\"),\n fragmentShader: [\n \"uniform float opacity;\",\n\n \"uniform sampler2D tDiffuse;\",\n\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vec4 texel = texture2D( tDiffuse, vUv );\",\n \"gl_FragColor = opacity * texel;\",\n\n \"}\"\n ].join(\"\\n\")\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-copyshader/index.js\n// module id = 9\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function RenderPass( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n if (!(this instanceof RenderPass)) return new RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha);\n\n this.scene = scene;\n this.camera = camera;\n\n this.overrideMaterial = overrideMaterial;\n\n this.clearColor = clearColor;\n this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n this.oldClearColor = new THREE.Color();\n this.oldClearAlpha = 1;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n };\n\n RenderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n this.scene.overrideMaterial = this.overrideMaterial;\n\n if ( this.clearColor ) {\n\n this.oldClearColor.copy( renderer.getClearColor() );\n this.oldClearAlpha = renderer.getClearAlpha();\n\n renderer.setClearColor( this.clearColor, this.clearAlpha );\n\n }\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n if ( this.clearColor ) {\n\n renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n }\n\n this.scene.overrideMaterial = null;\n\n }\n\n };\n\n return RenderPass;\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/renderpass.js\n// module id = 10\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE, EffectComposer) {\n function ShaderPass( shader, textureID ) {\n if (!(this instanceof ShaderPass)) return new ShaderPass(shader, textureID);\n\n this.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n this.material = new THREE.ShaderMaterial( {\n\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader\n\n } );\n\n this.renderToScreen = false;\n\n this.enabled = true;\n this.needsSwap = true;\n this.clear = false;\n\n };\n\n ShaderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n if ( this.uniforms[ this.textureID ] ) {\n\n this.uniforms[ this.textureID ].value = readBuffer;\n\n }\n\n EffectComposer.quad.material = this.material;\n\n if ( this.renderToScreen ) {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera );\n\n } else {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera, writeBuffer, this.clear );\n\n }\n\n }\n\n };\n\n return ShaderPass;\n\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/shaderpass.js\n// module id = 11\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function MaskPass( scene, camera ) {\n if (!(this instanceof MaskPass)) return new MaskPass(scene, camera);\n\n this.scene = scene;\n this.camera = camera;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n this.inverse = false;\n };\n\n MaskPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n var context = renderer.context;\n\n // don't update color or depth\n\n context.colorMask( false, false, false, false );\n context.depthMask( false );\n\n // set up stencil\n\n var writeValue, clearValue;\n\n if ( this.inverse ) {\n\n writeValue = 0;\n clearValue = 1;\n\n } else {\n\n writeValue = 1;\n clearValue = 0;\n\n }\n\n context.enable( context.STENCIL_TEST );\n context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n context.clearStencil( clearValue );\n\n // draw into the stencil buffer\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n renderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n // re-enable update of color and depth\n\n context.colorMask( true, true, true, true );\n context.depthMask( true );\n\n // only render where stencil is set to 1\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n context.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n }\n\n };\n\n return MaskPass\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/maskpass.js\n// module id = 12\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function ClearMaskPass() {\n if (!(this instanceof ClearMaskPass)) return new ClearMaskPass(scene, camera);\n this.enabled = true;\n };\n\n ClearMaskPass.prototype = {\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n var context = renderer.context;\n context.disable( context.STENCIL_TEST );\n }\n };\n\n return ClearMaskPass\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/clearmaskpass.js\n// module id = 13\n// module chunks = 0","module.exports = \"varying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvoid main() {\\r\\n\\tvec2 tmp = vec2(uv.x, uv.y);\\r\\n tmp = (tmp * 2.0) - vec2(1.0);\\r\\n f_ndcP = vec4(tmp, 1.0, 1.0) * 1000.0;\\r\\n f_uv = uv;\\r\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/pass-vert.glsl\n// module id = 14\n// module chunks = 0","module.exports = \"#define MAX_GEOMETRY_COUNT 100\\r\\n#define FAR_CLIP 1000.0\\r\\n#define SHADOW_ITERATIONS 64\\r\\n#define MAX_ITERATIONS 100\\r\\n#define EPSILON 0.005\\r\\n\\r\\n/* This is how I'm packing the data\\r\\nstruct geometry_t {\\r\\n vec3 position;\\r\\n float type;\\r\\n};\\r\\n*/\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\\r\\nuniform int u_count;\\r\\n\\r\\nuniform float u_debug;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\nfloat sdSphere( vec3 p, float s )\\r\\n{\\r\\n\\treturn length(p) - s;\\r\\n}\\r\\n\\r\\nfloat udBox( vec3 p, vec3 b )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0));\\r\\n}\\r\\n\\r\\nfloat sdPlane( vec3 p, vec4 n )\\r\\n{\\r\\n // n must be normalized\\r\\n return dot(p,n.xyz) + n.w;\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p, in vec3 c )\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2( c.z*c.y/c.x, -c.z );\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0)*qv/vv;\\r\\n return sqrt( dot(w,w) - max(d.x,d.y) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nRay getRay()\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = u_cameraPosition;\\r\\n\\tray.direction = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - ray.position);\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat evaluateGeometrySDF(vec3 point, vec4 geo)\\r\\n{\\r\\n\\tvec3 localPoint = point - geo.xyz;\\r\\n\\r\\n if(geo.w == 0.0)\\r\\n \\treturn udBox(localPoint, vec3(.5));\\r\\n\\telse if(geo.w == 1.0)\\r\\n\\t\\treturn sdSphere(localPoint, 1.0);\\r\\n\\telse if(geo.w == 2.0)\\r\\n\\t\\treturn sdCappedCone(localPoint * .5, normalize(vec3(1.0)));\\r\\n\\telse if(geo.w == 3.0)\\r\\n\\t\\treturn sdPlane(localPoint, vec4(0.0, 1.0, 0.0, 0.0));\\r\\n\\r\\n\\treturn FAR_CLIP;\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\r\\n \\tfor (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n float d = evaluateGeometrySDF(point, geo);\\r\\n\\r\\n \\tif(d < minDistance)\\r\\n \\t\\tminDistance = d;\\r\\n }\\r\\n\\r\\n return minDistance;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\\r\\n{\\t\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n\\t\\tfloat d = evaluateGeometrySDF(point, geo);\\r\\n \\r\\n \\tif(d < minDistance)\\r\\n \\t\\tminDistance = d;\\r\\n }\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n\\r\\nfloat evaluateShadows(vec3 point, vec3 light)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = point;\\r\\n\\tray.direction = (light - point);\\r\\n\\r\\n\\tfloat maxDistance = length(ray.direction);\\r\\n\\tray.direction = normalize(ray.direction);\\r\\n\\r\\n float t = 0.0;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = evaluateSceneSDFSimple(current);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\r\\n\\t\\tif(t > maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\treturn 1.0 - smoothstep(t, t + .5, maxDistance);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\tRay ray = getRay();\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n float t = 0.0;\\r\\n float iterationCount = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tfloat d = FAR_CLIP;\\r\\n\\t\\tevaluateSceneSDF(current, d);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t{\\r\\n\\t\\t\\tvec3 normal = estimateSceneGradient(current, EPSILON);\\r\\n\\r\\n\\t\\t\\tvec3 light = vec3(0.0, 4.0, 3.0);\\r\\n\\t\\t\\tvec3 l = light - current;\\r\\n\\r\\n\\t\\t\\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\t\\t\\tfloat diffuse = clamp(dot(normal, normalize(l)) * falloff, 0.0, 1.0);\\r\\n\\t\\t\\tfloat shadow = evaluateShadows(current + normal * .05, light);\\r\\n\\r\\n\\t\\t\\tcolor = vec3(diffuse * shadow);\\r\\n\\t\\t\\tbreak;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/rayMarch-frag.glsl\n// module id = 15\n// module chunks = 0","module.exports = __webpack_public_path__ + \"index.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/file-loader?name=[name].[ext]!./index.html\n// module id = 16\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\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\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 17\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 5ee275680a02dcc32b11","webpack:///./src/main.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./src/proxy_geometry.js","webpack:///./~/three/build/three.js","webpack:///./src/rayMarching.js","webpack:///./~/three-effectcomposer/index.js","webpack:///./~/three-copyshader/index.js","webpack:///./~/three-effectcomposer/lib/renderpass.js","webpack:///./~/three-effectcomposer/lib/shaderpass.js","webpack:///./~/three-effectcomposer/lib/maskpass.js","webpack:///./~/three-effectcomposer/lib/clearmaskpass.js","webpack:///./src/glsl/pass-vert.glsl","webpack:///./src/glsl/minion.frag.glsl","webpack:///./src/glsl/rayMarch-frag.glsl","webpack:///./index.html","webpack:///./~/three-orbit-controls/index.js"],"names":["require","THREE","OrbitControls","BoxGeometry","SphereGeometry","ConeGeometry","PlaneGeometry","TorusGeometry","Math","PI","CylinderGeometry","Engine","time","deltaTime","clock","window","addEventListener","stats","setMode","domElement","style","position","left","top","document","body","appendChild","scene","Scene","camera","PerspectiveCamera","innerWidth","innerHeight","renderer","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","Clock","controls","enableDamping","enableZoom","rotateSpeed","zoomSpeed","panSpeed","fov","updateProjectionMatrix","aspect","gui","GUI","options","strategy","debug","add","AxisHelper","DirectionalLight","proxyGeometry","boxMesh","Mesh","userData","geoType","sphereMesh","coneMesh","cylinderMesh","planeMesh","torusMesh","g1","Group","rotateX","torusWrapper","set","onBeforeRender","scale","sin","y","x","z","cos","rotateZ","group","target","lookAt","Vector3","rayMarcher","tick","getDelta","cameraTime","update","begin","render","buffer","transforms","end","requestAnimationFrame","ProxyMaterial","MeshLambertMaterial","color","PROXY_BUFFER_SIZE","ProxyGeometry","bounds","_buffer","Float32Array","_transforms","mesh","children","length","computeBuffer","remove","t","i","child","worldToLocal","Matrix4","getInverse","matrixWorld","toArray","RayMarcher","EffectComposer","minionComposer","minionPass","ShaderPass","uniforms","gradientMap","type","value","u_buffer","u_count","u_debug","u_viewProjectionMatrix","u_cameraPosition","u_transforms","vertexShader","fragmentShader","renderToScreen","addPass","composer","shaderPass","txLoader","TextureLoader","load","texture","material","RenderPass","inverseProjectionMatrix","minionScene","updateMatrix","projectionMatrix","matrix","clone","multiply"],"mappings":"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EA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;A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A;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,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A,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA,sBAAqB,mGAAmG,aAAa,2CAA2C,mBAAmB,SAAS,KAAK,4BAA4B,YAAY,gBAAg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,6CAA4C;AAC5C,EAAC,4BAA4B;;AAE7B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yBAAwB,0BAA0B;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,sBAAsB;;AAE5D;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B;;;AAG3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC;;AAEvC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,kBAAiB;;AAEjB;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB;;AAEhB;;AAEA;;AAEA;AACA;AACA,uDAAsD;;AAEtD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,2BAA0B;AAC1B;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;A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EA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,uBAAuB;;AAE7D;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,4BAA2B,gBAAgB;;AAE3C;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4BAA2B,kBAAkB;;AAE7C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH,0BAAyB;;AAEzB;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;AACnB,mBAAkB;AAClB,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,gDAA+C;AAC/C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,0BAA0B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG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A,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,4CAA2C,OAAO;;AAElD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uDAAsD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AEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,s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A;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAqB,eAAe;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,qBAAqB;;AAEtC;;AAEA;;AAEA,kBAAiB,eAAe;;AAEhC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;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A;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,cAAc;;AAE7D,EAAC;;;;;;;;;;;;mBC9x0CuBkB,U;;AAFxB;;AAHA,KAAMrH,QAAQ,mBAAAD,CAAQ,CAAR,CAAd;AACA,KAAMuH,iBAAiB,mBAAAvH,CAAQ,CAAR,EAAgCC,KAAhC,CAAvB;;AAIe,UAASqH,UAAT,CAAoBrF,QAApB,EAA8BN,KAA9B,EAAqCE,MAArC,EAA6C;;AAExD,SAAI2F,iBAAiB,IAAID,cAAJ,CAAmBtF,QAAnB,CAArB;AACA,SAAIwF,aAAa,IAAIF,eAAeG,UAAnB,CAA8B;AAC3CC,mBAAU;AACNC,0BAAa,EAAEC,MAAM,GAAR,EAAaC,OAAO,IAApB,EADP;AAENC,uBAAU;AACNF,uBAAM,KADA;AAENC,wBAAO,IAAIvB,YAAJ;AAFD,cAFJ;AAMNyB,sBAAS;AACLH,uBAAM,GADD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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5ee275680a02dcc32b11","require('file-loader?name=[name].[ext]!../index.html');\r\n\r\nconst THREE = require('three');\r\nconst OrbitControls = require('three-orbit-controls')(THREE)\r\n\r\nimport DAT from 'dat-gui'\r\nimport Stats from 'stats-js'\r\nimport ProxyGeometry, {ProxyMaterial} from './proxy_geometry'\r\nimport RayMarcher from './rayMarching'\r\n\r\nvar BoxGeometry = new THREE.BoxGeometry(1, 1, 1);\r\nvar SphereGeometry = new THREE.SphereGeometry(1, 32, 32);\r\nvar ConeGeometry = new THREE.ConeGeometry(1, 1);\r\nvar PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 );\r\nvar TorusGeometry = new THREE.TorusGeometry( 1, .2, 16, 16, Math.PI * 2);\r\nvar CylinderGeometry = new THREE.CylinderGeometry( 1, 1, 2, 16, 17, false );\r\n\r\nvar Engine = \r\n{\r\n time : 0.0,\r\n deltaTime : 0.0,\r\n clock : null,\r\n}\r\n\r\nwindow.addEventListener('load', function() {\r\n var stats = new Stats();\r\n stats.setMode(1);\r\n stats.domElement.style.position = 'absolute';\r\n stats.domElement.style.left = '0px';\r\n stats.domElement.style.top = '0px';\r\n document.body.appendChild(stats.domElement);\r\n\r\n var scene = new THREE.Scene();\r\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\r\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n renderer.setClearColor(0x999999, 1.0);\r\n document.body.appendChild(renderer.domElement);\r\n\r\n Engine.clock = new THREE.Clock();\r\n\r\n var controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.enableZoom = true;\r\n controls.rotateSpeed = 0.3;\r\n controls.zoomSpeed = 1.0;\r\n controls.panSpeed = 2.0;\r\n\r\n camera.fov = 45;\r\n camera.updateProjectionMatrix();\r\n\r\n\r\n window.addEventListener('resize', function() {\r\n camera.aspect = window.innerWidth / window.innerHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n });\r\n\r\n var gui = new DAT.GUI();\r\n\r\n var options = {\r\n strategy: 'Ray Marching',\r\n debug : false\r\n }\r\n\r\n gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Scene']);\r\n gui.add(options, 'debug');\r\n\r\n scene.add(new THREE.AxisHelper(20));\r\n scene.add(new THREE.DirectionalLight(0xffffff, 1));\r\n\r\n var proxyGeometry = new ProxyGeometry();\r\n\r\n var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial);\r\n boxMesh.userData = { geoType : 0 }\r\n\r\n var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial);\r\n sphereMesh.userData = { geoType : 1 }\r\n\r\n var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial);\r\n coneMesh.userData = { geoType : 2}\r\n\r\n var cylinderMesh = new THREE.Mesh(CylinderGeometry, ProxyMaterial);\r\n cylinderMesh.userData = { geoType : 5 }\r\n\r\n var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial);\r\n var torusMesh = new THREE.Mesh(TorusGeometry, ProxyMaterial);\r\n \r\n // These transformations need to be hidden\r\n var g1 = new THREE.Group();\r\n planeMesh.rotateX(Math.PI * -.5);\r\n g1.add(planeMesh);\r\n g1.userData = { geoType : 3 };\r\n\r\n var torusWrapper = new THREE.Group();\r\n torusMesh.rotateX(Math.PI * -.5);\r\n torusWrapper.add(torusMesh);\r\n torusWrapper.userData = { geoType : 4 };\r\n\r\n g1.position.set(0, -1, 0);\r\n boxMesh.position.set(-3, 0, 0);\r\n coneMesh.position.set(3, 0, 0);\r\n torusWrapper.position.set(0, 0, 4);\r\n cylinderMesh.position.set(4, 1, 4);\r\n\r\n coneMesh.onBeforeRender = function() { \r\n var scale = Math.sin(Engine.time) * .35 + 1\r\n coneMesh.scale.set(scale, scale, scale);\r\n }\r\n\r\n boxMesh.onBeforeRender = function() {\r\n boxMesh.position.y = Math.sin(Engine.time) * 2 + 1;\r\n };\r\n\r\n cylinderMesh.onBeforeRender = function() {\r\n cylinderMesh.position.y = Math.sin(Engine.time + 1.5) + 1;\r\n cylinderMesh.rotateX(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n sphereMesh.onBeforeRender = function() {\r\n sphereMesh.position.x = Math.sin(Engine.time + .5);\r\n sphereMesh.position.z = Math.cos(Engine.time + .5) - .5;\r\n sphereMesh.position.y = Math.sin(Engine.time + 2.3) - .5;\r\n };\r\n\r\n torusMesh.onBeforeRender = function() {\r\n torusWrapper.rotateZ(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n proxyGeometry.add(boxMesh);\r\n proxyGeometry.add(sphereMesh);\r\n proxyGeometry.add(coneMesh);\r\n proxyGeometry.add(g1);\r\n proxyGeometry.add(torusWrapper);\r\n proxyGeometry.add(cylinderMesh);\r\n\r\n scene.add(proxyGeometry.group);\r\n\r\n controls.target.set(0,1.5,0);\r\n\r\n camera.position.set(3, 3.5, 13);\r\n camera.lookAt(new THREE.Vector3(0,0,0));\r\n \r\n var rayMarcher = new RayMarcher(renderer, scene, camera);\r\n\r\n (function tick() {\r\n var deltaTime = Engine.clock.getDelta();\r\n\r\n Engine.time += deltaTime;\r\n Engine.cameraTime += deltaTime;\r\n Engine.deltaTime = deltaTime;\r\n\r\n controls.update();\r\n stats.begin();\r\n proxyGeometry.update();\r\n\r\n if (options.strategy === 'Proxy Geometry') {\r\n renderer.render(scene, camera);\r\n } else if (options.strategy === 'Ray Marching') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time);\r\n } else if (options.strategy === 'Scene') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time);\r\n }\r\n stats.end();\r\n requestAnimationFrame(tick);\r\n })();\r\n});\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 1\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 2\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 3\n// module chunks = 0","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 4\n// module chunks = 0","const THREE = require('three');\r\n\r\nexport var ProxyMaterial = new THREE.MeshLambertMaterial({\r\n color: 0xff0000\r\n});\r\n\r\nexport const PROXY_BUFFER_SIZE = 4;\r\n\r\nexport default class ProxyGeometry {\r\n constructor(bounds) {\r\n this.group = new THREE.Group();\r\n this._buffer = new Float32Array();\r\n this._transforms = new Float32Array();\r\n }\r\n\r\n add(mesh) {\r\n this.group.add(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n remove(mesh) {\r\n this.group.remove(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n update(t = 1/60) {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n\r\n // TODO: animate objects\r\n }\r\n this.computeBuffer();\r\n }\r\n\r\n computeBuffer() {\r\n const {children} = this.group;\r\n\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n this._buffer[PROXY_BUFFER_SIZE*i] = child.position.x;\r\n this._buffer[PROXY_BUFFER_SIZE*i+1] = child.position.y;\r\n this._buffer[PROXY_BUFFER_SIZE*i+2] = child.position.z;\r\n\r\n var worldToLocal = new THREE.Matrix4();\r\n worldToLocal.getInverse(child.matrixWorld);\r\n worldToLocal.toArray(this._transforms, i * 16);\r\n\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = child.userData.geoType;\r\n // if (child.geometry instanceof THREE.BoxGeometry) {\r\n // } else if (child.geometry instanceof THREE.SphereGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 1;\r\n // } else if (child.geometry instanceof THREE.ConeGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 2;\r\n // } else if (child.geometry instanceof THREE.PlaneGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 3;\r\n // } else if (child.geometry instanceof THREE.TorusGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 4;\r\n // } else if (child.geometry instanceof THREE.CylinderGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 5;\r\n // }\r\n }\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n\r\n get transforms()\r\n {\r\n return this._transforms;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/proxy_geometry.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tEventDispatcher.prototype = {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tvar REVISION = '84';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tvar textureId = 0;\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\t\tthis.x = ( m32 - m23 ) / s;\n\t\t\tthis.y = ( m13 - m31 ) / s;\n\t\t\tthis.z = ( m21 - m12 ) / s;\n\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\t\t\tthis.w = attribute.getW( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tWebGLRenderTarget.prototype = {\n\n\t\tconstructor: WebGLRenderTarget,\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\t\t\tvar w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ];\n\n\t\t\treturn this.divideScalar( w );\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCylindrical: function( c ) {\n\n\t\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\t\tthis.y = c.y;\n\t\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeShear: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, y, z, 0,\n\t\t\t\tx, 1, z, 0,\n\t\t\t\tx, y, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tif ( far === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"float 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}\\nvec2 ltcTextureCoords( const in GeometricContext geometry, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = (LUT_SIZE - 1.0)/LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5/LUT_SIZE;\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\\n\\tint config = 0;\\n\\tif ( L[0].z > 0.0 ) config += 1;\\n\\tif ( L[1].z > 0.0 ) config += 2;\\n\\tif ( L[2].z > 0.0 ) config += 4;\\n\\tif ( L[3].z > 0.0 ) config += 8;\\n\\tn = 0;\\n\\tif ( config == 0 ) {\\n\\t} else if ( config == 1 ) {\\n\\t\\tn = 3;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 2 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 3 ) {\\n\\t\\tn = 4;\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t\\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 4 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t} else if ( config == 5 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 6 ) {\\n\\t\\tn = 4;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 7 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 8 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = L[3];\\n\\t} else if ( config == 9 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t} else if ( config == 10 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 11 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 12 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t} else if ( config == 13 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = L[2];\\n\\t\\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t} else if ( config == 14 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t} else if ( config == 15 ) {\\n\\t\\tn = 4;\\n\\t}\\n\\tif ( n == 3 )\\n\\t\\tL[3] = L[0];\\n\\tif ( n == 4 )\\n\\t\\tL[4] = L[0];\\n}\\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\\n\\tfloat cosTheta = dot( v1, v2 );\\n\\tfloat theta = acos( cosTheta );\\n\\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\\n\\treturn res;\\n}\\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\\n\\trectPoints[0] = pos - halfWidth - halfHeight;\\n\\trectPoints[1] = pos + halfWidth - halfHeight;\\n\\trectPoints[2] = pos + halfWidth + halfHeight;\\n\\trectPoints[3] = pos - halfWidth + halfHeight;\\n}\\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tvec3 T1, T2;\\n\\tT1 = normalize(V - N * dot( V, N ));\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\\n\\tvec3 clippedRect[5];\\n\\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\\n\\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\\n\\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\\n\\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\\n\\tint n;\\n\\tclipQuadToHorizon(clippedRect, n);\\n\\tif ( n == 0 )\\n\\t\\treturn vec3( 0, 0, 0 );\\n\\tclippedRect[0] = normalize( clippedRect[0] );\\n\\tclippedRect[1] = normalize( clippedRect[1] );\\n\\tclippedRect[2] = normalize( clippedRect[2] );\\n\\tclippedRect[3] = normalize( clippedRect[3] );\\n\\tclippedRect[4] = normalize( clippedRect[4] );\\n\\tfloat sum = 0.0;\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\\n\\tif (n >= 4)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\\n\\tif (n == 5)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\\n\\tsum = max( 0.0, sum );\\n\\tvec3 Lo_i = vec3( sum, sum, sum );\\n\\treturn Lo_i;\\n}\\nvec3 Rect_Area_Light_Specular_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\\n\\t\\tconst in float roughness,\\n\\t\\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tvec2 uv = ltcTextureCoords( geometry, roughness );\\n\\tvec4 brdfLtcApproxParams, t;\\n\\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\\n\\tt = texture2D( ltcMat, uv );\\n\\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\\n\\tmat3 brdfLtcApproxMat = mat3(\\n\\t\\tvec3( 1, 0, t.y ),\\n\\t\\tvec3( 0, t.z, 0 ),\\n\\t\\tvec3( t.w, 0, t.x )\\n\\t);\\n\\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\\n\\tspecularReflectance *= brdfLtcScalar;\\n\\treturn specularReflectance;\\n}\\nvec3 Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tmat3 diffuseBrdfMat = mat3(1);\\n\\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\\n\\treturn diffuseReflectance;\\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\";\n\n\tvar 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\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, 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#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\n\tvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\n\tvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar 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};\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\\n\\t}\\n#endif\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff;\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar 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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#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\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar 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 ) * flipNormal;\\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\";\n\n\tvar 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\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar 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\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\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}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\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\\t#include \\n}\\n\";\n\n\tvar 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 \\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\\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\";\n\n\tvar 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 \\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\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\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\\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\";\n\n\tvar 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 \\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\";\n\n\tvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\n\tvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\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\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\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#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\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_vertex: fog_vertex,\n\t\tfog_pars_vertex: fog_pars_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\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 ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tgradientmap: {\n\n\t\t\tgradientMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} },\n\n\t\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\t\trectAreaLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\twidth: {},\n\t\t\t\theight: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.gradientmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tscale: { value: 1 },\n\t\t\t\t\tdashSize: { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\t\t\t\tlightPos: { value: new Vector3() }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tShaderLib.standard.uniforms,\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyMatrix4( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( fog.isFog ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar materialId = 0;\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tvar x = attribute.getX( i );\n\t\t\t\tvar y = attribute.getY( i );\n\t\t\t\tvar z = attribute.getZ( i );\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\treturn this.expandByObject( object );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function expandByObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box;\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tif ( box === undefined ) box = new Box3(); // see #10547\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( light && light.isPointLight ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\t// TODO (abelnation / sam-g-steel): is this needed?\n\t\t\t\tif (shadow && shadow.isRectAreaLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material && material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tvar object3DId = 0;\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\n\t\tthis.onBeforeRender = function () {};\n\t\tthis.onAfterRender = function () {};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject3D.prototype = {\n\n\t\tconstructor: Object3D,\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.layers.mask = source.layers.mask;\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\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\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int8Array( array ), itemSize );\n\n\t}\n\n\tInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\n\tfunction Uint8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8Array( array ), itemSize );\n\n\t}\n\n\tUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\n\tfunction Uint8ClampedBufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\n\tfunction Int16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int16Array( array ), itemSize );\n\n\t}\n\n\tInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\n\tfunction Uint16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint16Array( array ), itemSize );\n\n\t}\n\n\tUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\n\tfunction Int32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int32Array( array ), itemSize );\n\n\t}\n\n\tInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\n\tfunction Uint32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint32Array( array ), itemSize );\n\n\t}\n\n\tUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\n\tfunction Float32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float32Array( array ), itemSize );\n\n\t}\n\n\tFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\n\tfunction Float64BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float64Array( array ), itemSize );\n\n\t}\n\n\tFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, {\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex = undefined;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t// http://stackoverflow.com/questions/1669190/javascript-min-max-array-values/13440842#13440842\n\n\tfunction arrayMax( array ) {\n\n\t\tvar length = array.length, max = - Infinity;\n\n\t\twhile ( length -- ) {\n\n\t\t\tif ( array[ length ] > max ) {\n\n\t\t\t\tmax = array[ length ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn max;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tvar count = 0;\n\tfunction GeometryIdCount() { return count++; }\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tGeometry.prototype = {\n\n\t\tconstructor: Geometry,\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( ( geometry && geometry.isGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( ( mesh && mesh.isMesh ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar i, il, j, jl, k, kl;\n\n\t\t\t// reset\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.colors = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [[]];\n\t\t\tthis.morphTargets = [];\n\t\t\tthis.morphNormals = [];\n\t\t\tthis.skinWeights = [];\n\t\t\tthis.skinIndices = [];\n\t\t\tthis.lineDistances = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// vertices\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// face vertex uvs\n\n\t\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargets = source.morphTargets;\n\n\t\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = {};\n\t\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t\t// vertices\n\n\t\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// normals\n\n\t\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t\t// morph normals\n\n\t\t\tvar morphNormals = source.morphNormals;\n\n\t\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphNormal = {};\n\n\t\t\t\t// vertex normals\n\n\t\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// face normals\n\n\t\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t\t}\n\n\t\t\t// skin weights\n\n\t\t\tvar skinWeights = source.skinWeights;\n\n\t\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// skin indices\n\n\t\t\tvar skinIndices = source.skinIndices;\n\n\t\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// line distances\n\n\t\t\tvar lineDistances = source.lineDistances;\n\n\t\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// update flags\n\n\t\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tBufferGeometry.prototype = {\n\n\t\tconstructor: BufferGeometry,\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tif ( Array.isArray( index ) ) {\n\n\t\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tthis.index = index;\n\n\t\t\t}\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh ) {\n\n\t\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar position = this.attributes.position;\n\n\t\t\t\tif ( position ) {\n\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( ( geometry && geometry.isBufferGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// index\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tvar morphAttributes = source.morphAttributes;\n\n\t\t\tfor ( name in morphAttributes ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// draw range\n\n\t\t\tthis.drawRange.start = source.drawRange.start;\n\t\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uv ) {\n\n\t\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar intersection;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = ( material && material.isMultiMaterial );\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar uvs;\n\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar numberOfVertices = 0;\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth = width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar ix, iy;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar ix, iy;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else if ( index.array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\t\t\t\tsize = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t \n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\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 );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshToonMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( map.isTexture ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tvar type = gl.FLOAT;\n\t\t\tvar array = data.array;\n\n\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\ttype = gl.FLOAT;\n\n\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\ttype = gl.SHORT;\n\n\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\ttype = gl.INT;\n\n\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\ttype = gl.BYTE;\n\n\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t\t}\n\n\t\t\tattributeProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\t\tattributeProperties.type = type;\n\t\t\tattributeProperties.version = data.version;\n\n\t\t\tdata.onUploadCallback();\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\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.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getAttributeProperties( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data );\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute );\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetAttributeProperties: getAttributeProperties,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\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 );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar version = parseFloat( /^WebGL\\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );\n\t\tvar lineWidthAvailable = parseFloat( version ) >= 1.0;\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\t\t\tdepthBuffer.setClear( 1 );\n\t\t\tstencilBuffer.setClear( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t\t// internal state cache\n\n\t\t\t_currentProgram = null,\n\t\t\t_currentRenderTarget = null,\n\t\t\t_currentFramebuffer = null,\n\t\t\t_currentMaterialId = - 1,\n\t\t\t_currentGeometryProgram = '',\n\t\t\t_currentCamera = null,\n\n\t\t\t_currentScissor = new Vector4(),\n\t\t\t_currentScissorTest = null,\n\n\t\t\t_currentViewport = new Vector4(),\n\n\t\t\t//\n\n\t\t\t_usedTextureUnits = 0,\n\n\t\t\t//\n\n\t\t\t_clearColor = new Color( 0x000000 ),\n\t\t\t_clearAlpha = 0,\n\n\t\t\t_width = _canvas.width,\n\t\t\t_height = _canvas.height,\n\n\t\t\t_pixelRatio = 1,\n\n\t\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissorTest = false,\n\n\t\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t\t// frustum\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t// clipping\n\n\t\t\t_clipping = new WebGLClipping(),\n\t\t\t_clippingEnabled = false,\n\t\t\t_localClippingEnabled = false,\n\n\t\t\t_sphere = new Sphere(),\n\n\t\t\t// camera matrices cache\n\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_vector3 = new Vector3(),\n\t\t\t_matrix4 = new Matrix4(),\n\t\t\t_matrix42 = new Matrix4(),\n\n\t\t\t// light arrays cache\n\n\t\t\t_lights = {\n\n\t\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\trectArea: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\t\tshadows: []\n\n\t\t\t},\n\n\t\t\t// info\n\n\t\t\t_infoRender = {\n\n\t\t\t\tcalls: 0,\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0,\n\t\t\t\tpoints: 0\n\n\t\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundPlaneCamera, backgroundPlaneMesh;\n\t\tvar backgroundBoxCamera, backgroundBoxMesh;\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\t\tmaterial.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\t\tvar attributeProperties = objects.getAttributeProperties( geometryAttribute );\n\n\t\t\t\t\t\tvar buffer = attributeProperties.__webglBuffer;\n\t\t\t\t\t\tvar type = attributeProperties.type;\n\t\t\t\t\t\tvar bytesPerElement = attributeProperties.bytesPerElement;\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tstate.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tif ( backgroundBoxCamera === undefined ) {\n\n\t\t\t\t\tbackgroundBoxCamera = new PerspectiveCamera();\n\n\t\t\t\t\tbackgroundBoxMesh = new Mesh(\n\t\t\t\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\t\tfog: false\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );\n\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tif ( backgroundPlaneCamera === undefined ) {\n\n\t\t\t\t\tbackgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\t\tbackgroundPlaneMesh = new Mesh(\n\t\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t\t! material.isRawShaderMaterial ||\n\t\t\t\tmaterial.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.rectAreaLights.value = _lights.rectArea;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isMeshNormalMaterial ||\n\t\t\t\t\tmaterial.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// RectAreaLight Texture\n\t\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\t\tif ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE;\n\t\t\t\tif ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE;\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t\tif ( material.gradientMap ) {\n\n\t\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\t\tr = 0, g = 0, b = 0,\n\t\t\t\tcolor,\n\t\t\t\tintensity,\n\t\t\t\tdistance,\n\t\t\t\tshadowMap,\n\n\t\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\trectAreaLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\t// (a) intensity controls irradiance of entire light\n\t\t\t\t\tuniforms.color\n\t\t\t\t\t\t.copy( color )\n\t\t\t\t\t\t.multiplyScalar( intensity / ( light.width * light.height ) );\n\n\t\t\t\t\t// (b) intensity controls the radiance per light area\n\t\t\t\t\t// uniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\t\t_matrix42.identity();\n\t\t\t\t\t_matrix4.copy( light.matrixWorld );\n\t\t\t\t\t_matrix4.premultiply( viewMatrix );\n\t\t\t\t\t_matrix42.extractRotation( _matrix4 );\n\n\t\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\t\tuniforms.halfWidth.applyMatrix4( _matrix42 );\n\t\t\t\t\tuniforms.halfHeight.applyMatrix4( _matrix42 );\n\n\t\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\t\t_lights.rectArea[ rectAreaLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.rectArea.length = rectAreaLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t// TODO (sam-g-steel) why aren't we using join\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar i, j, l, o, ol;\n\t\tvar edge = [ 0, 0 ], edges = {}, e;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\t\tvar vertex;\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tvar position, indices, groups;\n\t\t\tvar group, start, count;\n\t\t\tvar index1, index2;\n\n\t\t\tvertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\t\t\t\tindices = geometry.index;\n\t\t\t\tgroups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.count );\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\t\tstart = group.start;\n\t\t\t\t\tcount = group.count;\n\n\t\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices.getX( i + j );\n\t\t\t\t\t\t\tedge[ 1 ] = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( key in edges ) {\n\n\t\t\t\t\te = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\n\t\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tvar v = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tvar u = j / slices;\n\n\t\t\t\tvar p = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\tvar a = i * sliceCount + j;\n\t\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tvar azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\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\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\t r, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, j;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\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.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // curve to extrude shape along\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( ( font && font.isFont ) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar ix, iy;\n\n\t\tvar index = 0;\n\t\tvar grid = [];\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = iy / heightSegments;\n\n\t\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tvar u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// some helper variables\n\n\t\tvar segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t */\n\n\tfunction ShapeGeometry( shapes, curveSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tcurveSegments = curveSegments || 12;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar groupStart = 0;\n\t\tvar groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tvar i, l, shapeHole;\n\n\t\t\tvar indexOffset = vertices.length / 3;\n\t\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\t\tvar shapeVertices = points.shape;\n\t\t\tvar shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t\t// also check if holes are in the opposite direction\n\n\t\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\t\tvar edge = [ 0, 0 ], edges = {};\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t\t// prepare source geometry\n\n\t\tvar geometry2;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar sourceVertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tkey = edge.toString();\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\tvar e = edges[ key ];\n\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar index = 0;\n\t\tvar indexOffset = 0;\n\t\tvar indexArray = [];\n\t\tvar halfHeight = height / 2;\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\n\t\t\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, s;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tShapeBufferGeometry: ShapeBufferGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tBoxGeometry: BoxGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = Array.isArray( materials ) ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author takahirox / http://github.com/takahirox\n\t *\n\t * parameters = {\n\t * gradientMap: new THREE.Texture( )\n\t * }\n\t */\n\n\tfunction MeshToonMaterial( parameters ) {\n\n\t\tMeshPhongMaterial.call( this );\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.gradientMap = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\n\tMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\n\tMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\n\tMeshToonMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshToonMaterial: MeshToonMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FileLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FileLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { type: mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMimeType: function ( value ) {\n\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tfunction DataTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( DataTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\t\timage.addEventListener( 'load', function () {\n\n\t\t\t\tCache.add( url, this );\n\n\t\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\t/*\n\t\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t\t}, false );\n\t\t\t*/\n\n\t\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\timage.src = url;\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function ( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function () {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function () {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function ( timeOffset ) {\n\n\t\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function ( timeScale ) {\n\n\t\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function ( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== - 1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function () {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif ( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function () {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0; m !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar BlendingMode = {\n\t\t\t\tNoBlending: NoBlending,\n\t\t\t\tNormalBlending: NormalBlending,\n\t\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\t\tCustomBlending: CustomBlending\n\t\t\t};\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\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.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = null;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tscope.parse( json, onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tvar TextureMapping = {\n\t\t\t\tUVMapping: UVMapping,\n\t\t\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\t\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\t\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\t\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\t\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\t\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\t\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t\t\t};\n\n\t\t\tvar TextureWrapping = {\n\t\t\t\tRepeatWrapping: RepeatWrapping,\n\t\t\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\t\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t\t\t};\n\n\t\t\tvar TextureFilter = {\n\t\t\t\tNearestFilter: NearestFilter,\n\t\t\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\t\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\t\t\tLinearFilter: LinearFilter,\n\t\t\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\t\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t\t\t};\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.' );\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Bezier Curves formulas obtained from\n\t * http://en.wikipedia.org/wiki/Bézier_curve\n\t */\n\n\tfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\tvar t2 = t * t;\n\t\tvar t3 = t * t2;\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t}\n\n\t//\n\n\tfunction QuadraticBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * p;\n\n\t}\n\n\tfunction QuadraticBezierP1( t, p ) {\n\n\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t}\n\n\tfunction QuadraticBezierP2( t, p ) {\n\n\t\treturn t * t * p;\n\n\t}\n\n\tfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\t\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\t\tQuadraticBezierP2( t, p2 );\n\n\t}\n\n\t//\n\n\tfunction CubicBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * k * p;\n\n\t}\n\n\tfunction CubicBezierP1( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn 3 * k * k * t * p;\n\n\t}\n\n\tfunction CubicBezierP2( t, p ) {\n\n\t\treturn 3 * ( 1 - t ) * t * t * p;\n\n\t}\n\n\tfunction CubicBezierP3( t, p ) {\n\n\t\treturn t * t * t * p;\n\n\t}\n\n\tfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\t\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\t\tCubicBezierP3( t, p3 );\n\n\t}\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.CatmullRomCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\n\n\t\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function ( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\treturn new Vector2(\n\t\t\tCatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),\n\t\t\tCatmullRom( weight, point0.y, point1.y, point2.y, point3.y )\n\t\t);\n\n\t};\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector2(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector2(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\t **/\n\n\tfunction ShapePath() {\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tShapePath.prototype = {\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push( this.currentPath );\n\t\t\tthis.currentPath.moveTo( x, y );\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tthis.currentPath.lineTo( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts ) {\n\n\t\t\tthis.currentPath.splineThru( pts );\n\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\t\toffsetX = 0;\n\t\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [];\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tvar AudioContext = {\n\n\t\tgetContext: function () {\n\n\t\t\tif ( context === undefined ) {\n\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t\t}\n\n\t\t\treturn context;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = AudioContext.getContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction RectAreaLight ( color, intensity, width, height ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.position.set( 0, 1, 0 );\n\t\tthis.updateMatrix();\n\n\t\tthis.width = ( width !== undefined ) ? width : 10;\n\t\tthis.height = ( height !== undefined ) ? height : 10;\n\n\t\t// TODO (abelnation): distance/decay\n\n\t\t// TODO (abelnation): update method for RectAreaLight to update transform to lookat target\n\n\t\t// TODO (abelnation): shadows\n\t\t// this.shadow = new THREE.RectAreaLightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\t// TODO (abelnation): RectAreaLight update when light shape is changed\n\tRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: RectAreaLight,\n\n\t\tisRectAreaLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\t// this.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.loop = false;\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.buffer;\n\t\t\tsource.loop = this.loop;\n\t\t\tsource.onended = this.onEnded.bind( this );\n\t\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\t\tsource.start( 0, this.startTime );\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.loop = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.loop = this.loop;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tbufferType = Array;\n\t\t\t\tmixFunction = this._select;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:[\\w-]+[\\/:])*)([\\w-]+)?(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?\\.([\\w-]+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ],\n\t\t\t\t\tknownObject = undefined;\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis._loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tAnimationMixer.prototype = {\n\n\t\tconstructor: AnimationMixer,\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function () {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function ( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function () {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function ( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function ( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function ( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function ( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function ( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function () {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function ( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function ( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function () {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tUniform.prototype.clone = function () {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n\t *\n\t */\n\n\tfunction Cylindrical( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tCylindrical.prototype = {\n\n\t\tconstructor: Cylindrical,\n\n\t\tset: function ( radius, theta, y ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.theta = theta;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.theta = other.theta;\n\t\t\tthis.y = other.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\t\tthis.y = vec3.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = 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} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar color1 = new Color( 0, 0, 1 );\n\t\tvar color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( object && object.isBone ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar boneMatrix = new Matrix4();\n\t\tvar matrixWorldInv = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\t\tfor ( var i = 0, j = 0; i < this.bones.length; i ++ ) {\n\n\t\t\t\tvar bone = this.bones[ i ];\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tj += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t * @author Mugen87 / http://github.com/Mugen87\n\t */\n\n\tfunction RectAreaLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar materialFront = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false\n\t\t} );\n\n\t\tvar materialBack = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false,\n\t\t\twireframe: true\n\t\t} );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 6 * 3 ), 3 ) );\n\n\t\t// shows the \"front\" of the light, e.g. where light comes from\n\n\t\tthis.add( new Mesh( geometry, materialFront ) );\n\n\t\t// shows the \"back\" of the light, which does not emit light\n\n\t\tthis.add( new Mesh( geometry, materialBack ) );\n\n\t\tthis.update();\n\n\t}\n\n\tRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\n\tRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\n\tRectAreaLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\t\tthis.children[ 1 ].geometry.dispose();\n\t\tthis.children[ 1 ].material.dispose();\n\n\t};\n\n\tRectAreaLightHelper.prototype.update = function () {\n\n\t\tvar vector1 = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh1 = this.children[ 0 ];\n\t\t\tvar mesh2 = this.children[ 1 ];\n\n\t\t\tif ( this.light.target ) {\n\n\t\t\t\tvector1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\t\tvar lookVec = vector2.clone().sub( vector1 );\n\t\t\t\tmesh1.lookAt( lookVec );\n\t\t\t\tmesh2.lookAt( lookVec );\n\n\t\t\t}\n\n\t\t\t// update materials\n\n\t\t\tmesh1.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tmesh2.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// calculate new dimensions of the helper\n\n\t\t\tvar hx = this.light.width * 0.5;\n\t\t\tvar hy = this.light.height * 0.5;\n\n\t\t\t// because the buffer attribute is shared over both geometries, we only have to update once\n\n\t\t\tvar position = mesh1.geometry.getAttribute( 'position' );\n\t\t\tvar array = position.array;\n\n\t\t\t// first face\n\n\t\t\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\t\t\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\t\t\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\n\t\t\t// second face\n\n\t\t\tarray[ 9 ] = - hx; array[ 10 ] = hy; array[ 11 ] = 0;\n\t\t\tarray[ 12 ] = - hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\t\t\tarray[ 15 ] = hx; array[ 16 ] = - hy; array[ 17 ] = 0;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction HemisphereLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } );\n\n\t\tvar position = geometry.getAttribute( 'position' );\n\t\tvar colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar color1 = new Color();\n\t\tvar color2 = new Color();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh = this.children[ 0 ];\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tcolor2.copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tsize = size || 10;\n\t\tdivisions = divisions || 10;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = size / divisions;\n\t\tvar halfSize = size / 2;\n\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author Hectate / http://www.github.com/Hectate\n\t */\n\n\tfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\t\tradius = radius || 10;\n\t\tradials = radials || 16;\n\t\tcircles = circles || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar x, z;\n\t\tvar v, i, j, r, color;\n\n\t\t// create the radials\n\n\t\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * radius;\n\t\t\tz = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tr = radius - ( radius / circles * i );\n\n\t\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tPolarGridHelper.prototype = Object.create( LineSegments.prototype );\n\tPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new BufferGeometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar colorFrustum = new Color( 0xffaa00 );\n\t\tvar colorCone = new Color( 0xff0000 );\n\t\tvar colorUp = new Color( 0x00aaff );\n\t\tvar colorTarget = new Color( 0xffffff );\n\t\tvar colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", colorFrustum );\n\t\taddLine( \"n2\", \"n4\", colorFrustum );\n\t\taddLine( \"n4\", \"n3\", colorFrustum );\n\t\taddLine( \"n3\", \"n1\", colorFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", colorFrustum );\n\t\taddLine( \"f2\", \"f4\", colorFrustum );\n\t\taddLine( \"f4\", \"f3\", colorFrustum );\n\t\taddLine( \"f3\", \"f1\", colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", colorFrustum );\n\t\taddLine( \"n2\", \"f2\", colorFrustum );\n\t\taddLine( \"n3\", \"f3\", colorFrustum );\n\t\taddLine( \"n4\", \"f4\", colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", colorCone );\n\t\taddLine( \"p\", \"n2\", colorCone );\n\t\taddLine( \"p\", \"n3\", colorCone );\n\t\taddLine( \"p\", \"n4\", colorCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", colorUp );\n\t\taddLine( \"u2\", \"u3\", colorUp );\n\t\taddLine( \"u3\", \"u1\", colorUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", colorTarget );\n\t\taddLine( \"p\", \"c\", colorCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", colorCross );\n\t\taddLine( \"cn3\", \"cn4\", colorCross );\n\n\t\taddLine( \"cf1\", \"cf2\", colorCross );\n\t\taddLine( \"cf3\", \"cf4\", colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\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 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( object && object.isBox3 ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry;\n\tvar coneGeometry;\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( lineGeometry === undefined ) {\n\n\t\t\tlineGeometry = new BufferGeometry();\n\t\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t];\n\n\t\tvar colors = [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\n\t/*\n\tBased on an optimized c++ solution in\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t - http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tfunction CubicPoly() {\n\n\t\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tfunction init( x0, x1, t0, t1 ) {\n\n\t\t\tc0 = x0;\n\t\t\tc1 = t0;\n\t\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t\t},\n\n\t\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\t\tt1 *= dt1;\n\t\t\t\tt2 *= dt1;\n\n\t\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t\t},\n\n\t\t\tcalc: function ( t ) {\n\n\t\t\t\tvar t2 = t * t;\n\t\t\t\tvar t3 = t2 * t;\n\t\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar tmp = new Vector3();\n\tvar px = new CubicPoly();\n\tvar py = new CubicPoly();\n\tvar pz = new CubicPoly();\n\n\tfunction CatmullRomCurve3( p /* array of Vector3 */ ) {\n\n\t\tthis.points = p || [];\n\t\tthis.closed = false;\n\n\t}\n\n\tCatmullRomCurve3.prototype = Object.create( Curve.prototype );\n\tCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\n\tCatmullRomCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar l = points.length;\n\n\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\tvar point = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tp1 = points[ intPoint % l ];\n\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t}\n\n\t\treturn new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );\n\n\t};\n\n\tfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve3.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\n\tCubicBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector3(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\n\tQuadraticBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector3(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t};\n\n\tfunction LineCurve3( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve3.prototype = Object.create( Curve.prototype );\n\tLineCurve3.prototype.constructor = LineCurve3;\n\n\tLineCurve3.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar vector = new Vector3();\n\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\tvector.multiplyScalar( t );\n\t\tvector.add( this.v1 );\n\n\t\treturn vector;\n\n\t};\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction MeshFaceMaterial( materials ) {\n\n\t\tconsole.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' );\n\t\treturn new MultiMaterial( materials );\n\n\t}\n\n\tfunction PointCloud( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction Particle( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\treturn new Sprite( material );\n\n\t}\n\n\tfunction ParticleSystem( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction PointCloudMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleBasicMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleSystemMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction Vertex( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\n\t}\n\n\t//\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\treturn new Int8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\treturn new Uint8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\treturn new Int16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\treturn new Uint16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\treturn new Int32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\treturn new Uint32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\treturn new Float64BufferAttribute( array, itemSize );\n\n\t}\n\n\t//\n\n\tCurve.create = function ( construct, getPoint ) {\n\n\t\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\t\tconstruct.prototype = Object.create( Curve.prototype );\n\t\tconstruct.prototype.constructor = construct;\n\t\tconstruct.prototype.getPoint = getPoint;\n\n\t\treturn construct;\n\n\t};\n\n\t//\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction SplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction Spline( points ) {\n\n\t\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\tObject.assign( Spline.prototype, {\n\n\t\tinitFromArray: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t\t},\n\t\tgetControlPointsArray: function ( optionalTarget ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t\t},\n\t\treparametrizeByArcLength: function ( samplingCoef ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\t//\n\tfunction BoundingBoxHelper( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\treturn new BoxHelper( object, color );\n\n\t}\n\n\tfunction EdgesHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\tfunction WireframeHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\t//\n\n\tfunction XHRLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\treturn new FileLoader( manager );\n\n\t}\n\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\treturn new DataTextureLoader( manager );\n\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tLine3.prototype.center = function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t};\n\n\t_Math.random16 = function () {\n\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t};\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\textractPosition: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\n\t\t},\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\trotateAxis: function ( v ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\ttranslate: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t\t},\n\t\trotateX: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t\t},\n\t\trotateY: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t\t},\n\t\trotateZ: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t\t},\n\t\trotateByAxis: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t\t},\n\t\tmakeFrustum: function( left, right, bottom, top, near, far ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t\t}\n\n\t} );\n\n\tPlane.prototype.isIntersectionLine = function ( line ) {\n\n\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\treturn this.intersectsLine( line );\n\n\t};\n\n\tQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t};\n\n\tObject.assign( Ray.prototype, {\n\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\n\t\textrude: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tsetEulerFromRotationMatrix: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t\t},\n\t\tapplyProjection: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\t\treturn this.applyMatrix4( m );\n\n\t\t},\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tGeometry.prototype.computeTangents = function () {\n\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t};\n\n\tObject.assign( Object3D.prototype, {\n\n\t\tgetChildByName: function ( name ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\n\t\t},\n\t\trenderDepth: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\n\t\teulerOrder: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\n\t\tobjects: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\n\t\tlength: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\t\treturn this.array.length;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\n\t\taddIndex: function ( index ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\t\tif ( indexOffset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\n\t\t},\n\t\tclearDrawCalls: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\n\t\t},\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t\t},\n\t\tcomputeOffsets: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\n\t\tdynamic: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\n\t\twrapAround: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\t\tmetal: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\n\t\tderivatives: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\n\t\tsupportsFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\t\treturn this.capabilities.vertexTextures;\n\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\n\t\t},\n\t\tinitMaterial: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t\t},\n\t\taddPrePlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t\t},\n\t\taddPostPlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t\t},\n\t\tupdateShadowMap: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.enabled;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.cullFace;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\n\t\tcullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\t\twrapS: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tAudio.prototype.load = function ( file ) {\n\n\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\tvar scope = this;\n\t\tvar audioLoader = new AudioLoader();\n\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\tscope.setBuffer( buffer );\n\n\t\t} );\n\t\treturn this;\n\n\t};\n\n\tAudioAnalyser.prototype.getData = function () {\n\n\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\treturn this.getFrequencyData();\n\n\t};\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector() {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function () {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer() {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.Texture = Texture;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.FileLoader = FileLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.RectAreaLight = RectAreaLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.AudioContext = AudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Cylindrical = Cylindrical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.RectAreaLightHelper = RectAreaLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.PolarGridHelper = PolarGridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.Path = Path;\n\texports.ShapePath = ShapePath;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ShapeBufferGeometry = ShapeBufferGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshToonMaterial = MeshToonMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.Float64BufferAttribute = Float64BufferAttribute;\n\texports.Float32BufferAttribute = Float32BufferAttribute;\n\texports.Uint32BufferAttribute = Uint32BufferAttribute;\n\texports.Int32BufferAttribute = Int32BufferAttribute;\n\texports.Uint16BufferAttribute = Uint16BufferAttribute;\n\texports.Int16BufferAttribute = Int16BufferAttribute;\n\texports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\n\texports.Uint8BufferAttribute = Uint8BufferAttribute;\n\texports.Int8BufferAttribute = Int8BufferAttribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MeshFaceMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Particle;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.Spline = Spline;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.XHRLoader = XHRLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 6\n// module chunks = 0","const THREE = require('three');\r\nconst EffectComposer = require('three-effectcomposer')(THREE)\r\n\r\nimport {PROXY_BUFFER_SIZE} from './proxy_geometry'\r\n\r\nexport default function RayMarcher(renderer, scene, camera) {\r\n\r\n var minionComposer = new EffectComposer(renderer);\r\n var minionPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n gradientMap: { type: \"t\", value: null},\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/minion.frag.glsl')\r\n });\r\n minionPass.renderToScreen = true;\r\n minionComposer.addPass(minionPass);\r\n\r\n var composer = new EffectComposer(renderer);\r\n var shaderPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/rayMarch-frag.glsl')\r\n });\r\n shaderPass.renderToScreen = true;\r\n\r\n var txLoader = new THREE.TextureLoader();\r\n txLoader.load('./images/gradients.png', function(texture) {\r\n minionPass.material.uniforms.gradientMap.value = texture;\r\n });\r\n\r\n // Adding this composer we force updating the scene transformations\r\n composer.addPass(new EffectComposer.RenderPass(scene, camera));\r\n composer.addPass(shaderPass);\r\n\r\n var inverseProjectionMatrix = new THREE.Matrix4();\r\n\r\n return {\r\n render: function(buffer, transforms, camera, options, minionScene, time) \r\n {\r\n\r\n camera.updateMatrix();\r\n camera.updateProjectionMatrix();\r\n inverseProjectionMatrix.getInverse(camera.projectionMatrix);\r\n\r\n if(minionScene)\r\n {\r\n minionPass.material.uniforms.u_buffer.value = buffer;\r\n minionPass.material.uniforms.u_transforms.value = transforms;\r\n minionPass.material.uniforms.u_count.value = 0;\r\n minionPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n minionPass.material.uniforms.time.value = time;\r\n\r\n minionPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n minionPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n minionComposer.render();\r\n }\r\n else\r\n {\r\n shaderPass.material.uniforms.u_buffer.value = buffer;\r\n shaderPass.material.uniforms.u_transforms.value = transforms;\r\n shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE;\r\n shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n shaderPass.material.uniforms.time.value = time;\r\n\r\n shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n composer.render();\r\n } \r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/rayMarching.js","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n var CopyShader = EffectComposer.CopyShader = require('three-copyshader')\n , RenderPass = EffectComposer.RenderPass = require('./lib/renderpass')(THREE)\n , ShaderPass = EffectComposer.ShaderPass = require('./lib/shaderpass')(THREE, EffectComposer)\n , MaskPass = EffectComposer.MaskPass = require('./lib/maskpass')(THREE)\n , ClearMaskPass = EffectComposer.ClearMaskPass = require('./lib/clearmaskpass')(THREE)\n\n function EffectComposer( renderer, renderTarget ) {\n this.renderer = renderer;\n\n if ( renderTarget === undefined ) {\n var width = window.innerWidth || 1;\n var height = window.innerHeight || 1;\n var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\n renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n this.passes = [];\n\n this.copyPass = new ShaderPass( CopyShader );\n };\n\n EffectComposer.prototype = {\n swapBuffers: function() {\n\n var tmp = this.readBuffer;\n this.readBuffer = this.writeBuffer;\n this.writeBuffer = tmp;\n\n },\n\n addPass: function ( pass ) {\n\n this.passes.push( pass );\n\n },\n\n insertPass: function ( pass, index ) {\n\n this.passes.splice( index, 0, pass );\n\n },\n\n render: function ( delta ) {\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n var maskActive = false;\n\n var pass, i, il = this.passes.length;\n\n for ( i = 0; i < il; i ++ ) {\n\n pass = this.passes[ i ];\n\n if ( !pass.enabled ) continue;\n\n pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n if ( pass.needsSwap ) {\n\n if ( maskActive ) {\n\n var context = this.renderer.context;\n\n context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n }\n\n this.swapBuffers();\n\n }\n\n if ( pass instanceof MaskPass ) {\n\n maskActive = true;\n\n } else if ( pass instanceof ClearMaskPass ) {\n\n maskActive = false;\n\n }\n\n }\n\n },\n\n reset: function ( renderTarget ) {\n\n if ( renderTarget === undefined ) {\n\n renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = window.innerWidth;\n renderTarget.height = window.innerHeight;\n\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n },\n\n setSize: function ( width, height ) {\n\n var renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = width;\n renderTarget.height = height;\n\n this.reset( renderTarget );\n\n }\n\n };\n\n // shared ortho camera\n\n EffectComposer.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n EffectComposer.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\n EffectComposer.scene = new THREE.Scene();\n EffectComposer.scene.add( EffectComposer.quad );\n\n return EffectComposer\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/index.js\n// module id = 8\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nmodule.exports = {\n uniforms: {\n \"tDiffuse\": { type: \"t\", value: null },\n \"opacity\": { type: \"f\", value: 1.0 }\n },\n vertexShader: [\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vUv = uv;\",\n \"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n \"}\"\n ].join(\"\\n\"),\n fragmentShader: [\n \"uniform float opacity;\",\n\n \"uniform sampler2D tDiffuse;\",\n\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vec4 texel = texture2D( tDiffuse, vUv );\",\n \"gl_FragColor = opacity * texel;\",\n\n \"}\"\n ].join(\"\\n\")\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-copyshader/index.js\n// module id = 9\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function RenderPass( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n if (!(this instanceof RenderPass)) return new RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha);\n\n this.scene = scene;\n this.camera = camera;\n\n this.overrideMaterial = overrideMaterial;\n\n this.clearColor = clearColor;\n this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n this.oldClearColor = new THREE.Color();\n this.oldClearAlpha = 1;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n };\n\n RenderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n this.scene.overrideMaterial = this.overrideMaterial;\n\n if ( this.clearColor ) {\n\n this.oldClearColor.copy( renderer.getClearColor() );\n this.oldClearAlpha = renderer.getClearAlpha();\n\n renderer.setClearColor( this.clearColor, this.clearAlpha );\n\n }\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n if ( this.clearColor ) {\n\n renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n }\n\n this.scene.overrideMaterial = null;\n\n }\n\n };\n\n return RenderPass;\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/renderpass.js\n// module id = 10\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE, EffectComposer) {\n function ShaderPass( shader, textureID ) {\n if (!(this instanceof ShaderPass)) return new ShaderPass(shader, textureID);\n\n this.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n this.material = new THREE.ShaderMaterial( {\n\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader\n\n } );\n\n this.renderToScreen = false;\n\n this.enabled = true;\n this.needsSwap = true;\n this.clear = false;\n\n };\n\n ShaderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n if ( this.uniforms[ this.textureID ] ) {\n\n this.uniforms[ this.textureID ].value = readBuffer;\n\n }\n\n EffectComposer.quad.material = this.material;\n\n if ( this.renderToScreen ) {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera );\n\n } else {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera, writeBuffer, this.clear );\n\n }\n\n }\n\n };\n\n return ShaderPass;\n\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/shaderpass.js\n// module id = 11\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function MaskPass( scene, camera ) {\n if (!(this instanceof MaskPass)) return new MaskPass(scene, camera);\n\n this.scene = scene;\n this.camera = camera;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n this.inverse = false;\n };\n\n MaskPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n var context = renderer.context;\n\n // don't update color or depth\n\n context.colorMask( false, false, false, false );\n context.depthMask( false );\n\n // set up stencil\n\n var writeValue, clearValue;\n\n if ( this.inverse ) {\n\n writeValue = 0;\n clearValue = 1;\n\n } else {\n\n writeValue = 1;\n clearValue = 0;\n\n }\n\n context.enable( context.STENCIL_TEST );\n context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n context.clearStencil( clearValue );\n\n // draw into the stencil buffer\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n renderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n // re-enable update of color and depth\n\n context.colorMask( true, true, true, true );\n context.depthMask( true );\n\n // only render where stencil is set to 1\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n context.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n }\n\n };\n\n return MaskPass\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/maskpass.js\n// module id = 12\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function ClearMaskPass() {\n if (!(this instanceof ClearMaskPass)) return new ClearMaskPass(scene, camera);\n this.enabled = true;\n };\n\n ClearMaskPass.prototype = {\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n var context = renderer.context;\n context.disable( context.STENCIL_TEST );\n }\n };\n\n return ClearMaskPass\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/clearmaskpass.js\n// module id = 13\n// module chunks = 0","module.exports = \"#define FAR_CLIP 1000.0\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayDir;\\r\\nvarying vec3 f_rayPos;\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nvoid main() {\\r\\n\\tvec2 tmp = vec2(uv.x, uv.y);\\r\\n tmp = (tmp * 2.0) - vec2(1.0);\\r\\n f_ndcP = vec4(tmp, 1.0, 1.0) * FAR_CLIP;\\r\\n f_uv = uv;\\r\\n\\r\\n f_rayDir = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - u_cameraPosition);\\r\\n f_rayPos = u_cameraPosition;\\r\\n\\r\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/pass-vert.glsl\n// module id = 14\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 32\\r\\n#define SECONDARY_ITERATIONS 2\\r\\n#define EPSILON 0.01\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .0075\\r\\n\\r\\n#define AO_ITERATIONS 4\\r\\n#define AO_DELTA .133\\r\\n#define AO_DECAY .8\\r\\n#define AO_INTENSITY .3\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 18\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .01\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nuniform sampler2D gradientMap;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: https://github.com/stackgl/glsl-smooth-min\\r\\nfloat smin(float a, float b, float k) \\r\\n{\\r\\n float res = exp(-k * a) + exp(-k * b);\\r\\n return -log(res) / k;\\r\\n}\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p, float r )\\r\\n{\\r\\n\\treturn length(p) - r;\\r\\n}\\r\\n\\r\\nfloat udBox(vec3 p, vec3 b)\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p, vec2 h)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - h;\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat pow8(float x)\\r\\n{\\r\\n\\tx *= x; // xˆ2\\r\\n\\tx *= x; // xˆ4\\r\\n\\treturn x * x;\\r\\n}\\r\\n\\r\\nfloat length8(vec2 v)\\r\\n{\\r\\n\\treturn pow(pow8(v.x) + pow8(v.y), .125);\\r\\n}\\r\\n// float wheelDistance(Point3 X, Point3 C, float r, float R) {\\r\\n// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R;\\r\\n// }\\r\\n\\r\\nfloat sdTorus82( vec3 p, vec2 t )\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-t.x,p.y);\\r\\n return length8(q)-t.y;\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat sdHexPrism( vec3 p, vec2 h )\\r\\n{\\r\\n vec3 q = abs(p);\\r\\n return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\\r\\n{\\r\\n vec3 pa = p - a, ba = b - a;\\r\\n float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\\r\\n return length( pa - ba*h ) - r;\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat sdEllipsoid( in vec3 p, in vec3 r )\\r\\n{\\r\\n return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\\r\\n}\\r\\n\\r\\nfloat opUnion( float d1, float d2 )\\r\\n{\\r\\n return min(d1, d2);\\r\\n}\\r\\n\\r\\nvec3 opCheapBend( vec3 p, float magnitude)\\r\\n{\\r\\n float c = cos(magnitude * p.y);\\r\\n float s = sin(magnitude * p.y);\\r\\n mat2 m = mat2(c, -s, s, c);\\r\\n vec3 q = vec3( m * p.xy, p.z);\\r\\n return q;\\r\\n}\\r\\n\\r\\nfloat repeatDimension(float x, float m, float extent)\\r\\n{\\r\\n\\treturn mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent));\\r\\n}\\r\\n\\r\\nfloat backgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5));\\r\\n\\tbase = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0));\\r\\n\\tbase = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5)));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat farBackgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat singleTrackSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(20.0, .3, .3));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\r\\n\\tvec3 detailP = point + vec3(0.0, 0.0, -0.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, udBox(detailP, vec3(.075, .3, .1)));\\r\\n\\r\\n\\tdetailP = point + vec3(0.5, .35, -.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\tdetailP = point + vec3(0.75, .35, .3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat clawSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(.65));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1)));\\r\\n\\r\\n\\tpoint += vec3(0.0, 4.45, 0.0);\\r\\n\\tbase = min(base, udBox(point, vec3(.3, .3, .3)));\\r\\n\\r\\n\\tbase = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0));\\r\\n\\tbase = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat tracksSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0));\\t\\r\\n\\r\\n\\t// Neverending claws\\r\\n\\tpoint.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0);\\r\\n\\tbase = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0)));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat railingSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2)));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5)));\\r\\n\\r\\n\\r\\n\\t// Railing bump map ;)\\r\\n\\tvec3 bumpPoint = point + vec3(0.0, 1.15, 0.0);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tbumpPoint = point + vec3(0.25, 1.15, 0.25);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tvec3 columnPoint = point + vec3(3.0, 1.25, -2.5);\\r\\n\\tcolumnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0));\\r\\n\\tcolumnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0));\\r\\n\\r\\n\\tfloat column = udBox(columnPoint, vec3(.35, 50.0, .35));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\r\\n\\tbase = min(base, column);\\r\\n\\r\\n\\tvec3 rep = vec3(1.0, 100.0, 10.0);\\r\\n\\r\\n\\tvec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy;\\r\\n\\tscrewPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5;\\r\\n\\tfloat screws1 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\tscrewPoint.y += 4.25;\\r\\n\\tfloat screws2 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\r\\n\\treturn min(min(base, screws1), screws2);\\r\\n}\\r\\n\\r\\nfloat minionBaseSDF(vec3 point)\\r\\n{\\r\\n\\tvec3 blendOffset = vec3(0.0, 1.5, 0.0);\\r\\n\\tvec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset;\\r\\n\\tvec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset;\\r\\n\\r\\n\\tfloat base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15);\\r\\n\\r\\n\\tfloat hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135);\\r\\n\\tfloat hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135);\\r\\n\\r\\n\\tfloat foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2);\\r\\n\\tfloat foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2);\\r\\n\\r\\n\\tfloat dist = smin(base, hand1, 5.0);\\r\\n\\tdist = smin(dist, hand2, 5.0);\\r\\n\\tdist = smin(dist, foot1, 5.0);\\r\\n\\tdist = smin(dist, foot2, 5.0);\\r\\n\\r\\n\\t// Left Hand\\r\\n\\tbendedPointSym.y -= .15;\\r\\n\\tfloat handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers (note: cylinders would make it better.. but no time!)\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase1);\\r\\n\\r\\n\\t// Right Hand\\r\\n\\tbendedPoint.y -= .15;\\r\\n\\tfloat handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase2);\\r\\n\\r\\n\\tvec3 glassPoint = point - vec3(0.0, 3.0, 1.15);\\t\\r\\n\\tfloat glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1));\\r\\n\\r\\n\\tfloat belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125));\\r\\n\\tbelt = max(belt, -sdSphere(glassPoint, .5));\\r\\n\\tglassBase = min(glassBase, belt);\\r\\n\\tdist = min(dist, glassBase);\\r\\n\\r\\n\\tdist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55));\\r\\n\\r\\n\\tfloat mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0));\\r\\n\\r\\n\\tdist = max(dist, -mouth);\\r\\n\\r\\n\\treturn dist;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\n// TODO: add material types\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial)\\r\\n{\\t\\r\\n\\thitMaterial = 0.0;\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n\\tfloat farBackground = farBackgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, farBackground);\\r\\n\\thitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001));\\r\\n\\r\\n\\tfloat minion = minionBaseSDF(point);\\r\\n\\tminDistance = min(minDistance, minion);\\r\\n\\thitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001));\\r\\n\\r\\n\\tfloat railing = railingSDF(point);\\r\\n\\tminDistance = min(minDistance, railing);\\r\\n\\thitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001));\\r\\n\\r\\n\\tfloat background = backgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, background);\\r\\n\\thitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001));\\r\\n\\t\\r\\n\\tfloat tracks = tracksSDF(point);\\r\\n\\tminDistance = min(minDistance, tracks);\\r\\n\\thitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001));\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\tminDistance = min(minDistance, minionBaseSDF(point));\\r\\n\\tminDistance = min(minDistance, railingSDF(point));\\r\\n\\tminDistance = min(minDistance, backgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, farBackgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, tracksSDF(point));\\r\\n\\treturn minDistance;\\t\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t, float material)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(1.0, 5.0, 7.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5;\\r\\n\\r\\n\\tfloat falloff = 40.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\tfloat facingRatio = dot(-ray.direction, normal);\\r\\n\\r\\n\\tvec4 g = texture2D(gradientMap, vec2((material * .2) + .1, facingRatio));\\r\\n\\r\\n\\tvec3 color = mix(g.rgb, vec3(diffuse), .15);\\r\\n\\r\\n\\treturn color * (shadow * ao * falloff);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n float hitMaterial = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d, hitMaterial);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t, hitMaterial);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/minion.frag.glsl\n// module id = 15\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n\\r\\n#define MAX_GEOMETRY_COUNT 50\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 64\\r\\n#define SECONDARY_ITERATIONS 3\\r\\n#define EPSILON 0.005\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .005\\r\\n\\r\\n#define AO_ITERATIONS 5\\r\\n#define AO_DELTA .1\\r\\n#define AO_DECAY .8\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 24\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .005\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform mat4 u_transforms[MAX_GEOMETRY_COUNT];\\r\\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\\r\\nuniform int u_count;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p )\\r\\n{\\r\\n\\treturn length(p) - 1.0;\\r\\n}\\r\\n\\r\\nfloat udBox( vec3 p)\\r\\n{\\r\\n\\treturn length(max(abs(p) - vec3(.5), 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0);\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform)\\r\\n{\\r\\n\\tvec3 rep = vec3(18.0, 100.0, 18.0);\\r\\n\\tpoint = mod(point + rep * .5, rep) - rep * .5;\\r\\n\\tvec3 localPoint = (transform * vec4(point, 1.0)).xyz;\\r\\n\\r\\n if(geo.w == 0.0)\\r\\n \\treturn udBox(localPoint);\\r\\n\\telse if(geo.w == 1.0)\\r\\n\\t\\treturn sdSphere(localPoint);\\r\\n\\telse if(geo.w == 2.0)\\r\\n\\t\\treturn sdCappedCone(localPoint * .5);\\r\\n\\telse if(geo.w == 3.0)\\r\\n\\t\\treturn sdPlane(localPoint);\\r\\n\\telse if(geo.w == 4.0)\\r\\n\\t\\treturn sdTorus(localPoint);\\r\\n\\telse if(geo.w == 5.0)\\r\\n\\t\\treturn sdCappedCylinder(localPoint);\\r\\n\\r\\n\\treturn FAR_CLIP;\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\r\\n \\tfor (int i = 0; i < MAX_GEOMETRY_COUNT; i++) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n\\r\\n return minDistance;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\\r\\n{\\t\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n \\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * .15, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(0.0, 4.0, 3.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0);\\r\\n\\tfloat shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\treturn vec3(diffuse * falloff * shadow * ao);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/rayMarch-frag.glsl\n// module id = 16\n// module chunks = 0","module.exports = __webpack_public_path__ + \"index.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/file-loader?name=[name].[ext]!./index.html\n// module id = 17\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\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\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 18\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file From 00a305ea9aaa012a4605ff28592441bdb857975a Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 04:43:45 -0500 Subject: [PATCH 16/26] * Fix --- build/gradients.png | Bin 0 -> 83030 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 build/gradients.png diff --git a/build/gradients.png b/build/gradients.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f3ea992eb8287bd0307f5ef18d584966010f51 GIT binary patch literal 83030 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 G5}E++n>(@q literal 0 HcmV?d00001 From 898cbc5edcf9095fed2392b3b922abe6ccdb8221 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 04:45:43 -0500 Subject: [PATCH 17/26] * Moving textures... --- {build => src/images}/gradients.png | Bin src/images/gradients.psd | Bin 0 -> 5329387 bytes src/main.js | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) rename {build => src/images}/gradients.png (100%) create mode 100644 src/images/gradients.psd diff --git a/build/gradients.png b/src/images/gradients.png similarity index 100% rename from build/gradients.png rename to src/images/gradients.png diff --git a/src/images/gradients.psd b/src/images/gradients.psd new file mode 100644 index 0000000000000000000000000000000000000000..2ec1207f9def74fdc2c2a416549bb76a0a02ba73 GIT binary patch literal 5329387 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%0AyV>31?sVJSTq2nmoEV)rK5<%N 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

9b@15?|*)P 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�D2N=tI%j=0;~+w9zBYws`0NzN$A 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

`5#{bTPwBLDfifDz1(8yo+ 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

$K^nxQTR0AjAhf*`^u-D$fJ9{oBsOLhXRI) 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 ^BYU=y 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

c3c)&XwO@bc*%8HIoI1c92qJ4 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 q^WvlX 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

i4hg+5(Kol<;VHwO&PClH14Cp!8U&qZTh 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

#D;x7XJ03xHL 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�armitFAtX> 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≈bK|VIjcGjhPSj}5m^0E| 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�Y)h*KGFzfkv{Y$uD()6$>#~NcvVsHT_?7F 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

A{;gg3BPCuZKwyR@iO+=FY-7P0d=)7z$Dy10g& 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 z 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 ~ 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 !};4h-VW82zq-%>w(6tmD%B$=^3HX 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�~|u>7pYQ zr`<>lNy6NRG>kzKBmvTZF^0yNIzBF1KQ=k9rmeHNuCX26AsqwpNzrX2u4(+L~%m0S1~z=H{Dp z4Xpjr8+J|XBZsm7=9?8Us7CNQC^&% zDN2e758(pUf`Nl5HrfX>CnXM|@n;a^XryCe?da@+vO!mm%{2SL=m*PUR}>F=dE;W; zpYf&mcovo-%9Q7G71Jg&Li9iD%{lQ$KY?U8`w}%=x1fMUqkJ%u(H&|^8V`Zs=^qDfa;x+kjTa-pZ@c| zzWL_Lzd!!+-F=^BHod#MzxB+KBM(oedUkdiXM6ca8Tm%oy19jW7$-#7dN%b{4E_1@ z-~P}0m}PwY;ivC^^7b!MbOKX-DxICv9sGRtwxpWb`)t-t`^5m3$QGXN_U=iJ2abxY zJv`j3&b;#6Pr+f9P9Q#SzlAx_eK^o*o)Qi}0~|)y;lN@NbPo>GfWwY1B^(N#_^)tK zPJ(ziOwGx8*D2sI{@>wH132{2ws;*5%g_YWGopfn{FLzY{FAcR&_A^@^()c@=Z6p9 zKMDUU;9xk#SB&&iP$Lb3rl(hD0*5XQ?rd&e02@9y^6_uKLTvo6Uw!t`(?@wlK$fB| zv_Igh8>vCG5FkNtJL4{vr!=@g6fOT)TLC7dX}o8eb^ZD0D=OFvit~y`@EBCC z2dY-8-vuZXm0IN`cvnlykyKUQtYFDu1a>^dfvp3?bAN}N$rLV1z5PKk`f7 zA{k#(5dNzJN6M+yq==C49E&<+5kNFzs4ewtHC&P^T@QeXm(q3paW37gC23L2ws zW!?oO*3#HiwMa-4@4fU0DTlFf6)AMltP0^ksOatK;kpbkWp8f4 z-8i2qfYrQ=hlRXAk9NptL&DTNDKRO9O*f?GDXN|VE8u%fh>Nm{j?XA-Y^kqn?%J`V zr?rj}u4-^ljy-`&IvnE`O^zQuh!({Cix*$|<$r1iIX(g!8|gnt3k8dt2pw#QuV1-x z9r2X6u9<%K&;R}U?^jlD|Kr0;m>9t&TUmpa4|%5=K+)1FgKXfVDN(zbQ$;hQ(qaiT zTt-G_Zhl6n5yJ>Hb@es%UBa`nk`M!ee0a#8_(W_9N*lI~9fK+M)k}x^iV|Y8s~T$Z zlf$WE92;Tek|f0YBxRRWRh8x;=P@$aXS0X*mh`ITrpkhJta5{cX=Wdv93K_pX>V?% zrzM77PzYEiRHSWcWnrWtRNv&0(y({>!2E&P$>ILqZT-VL(w#I6JtE_fjERLd&k4${ zN99OtL_%gBSExycN~kEwN!5>y3dNCl0E$H5B#MTCIvC3d8XDnTFWT2ePutYi$r(}w zmx53Z*a`S;#;u+!imxz6+Kl@=S_y3Sk@+${cX6kuK&qpfk1y^uI2S!v@CA4A%8h}W z%uRu4d2S;pf?cevL%f5%J)9jq-K=datTDEa3QsLace8UysL#wui%8DS@$rpK&rC`w zDJ@A&4f3_qH_PhD@Q+Q|J9_c#>BnBVbnfX#3Z88!vi(_gdVGFES9PLQN}7JQU7(kq zp_!(oi?NkqsDrM0a8bh0k;9Lkm_Br3abn-Gk%LoJjJmCjbFh!iW?OqhO=nXxdrMst zv6wM)b~G@yv(we{+v}~PWvXHBI(zwv{|_i`w_SMv6gPY1q#_nh0u+1igJP{uu|sr0 zDI=zLLPiiN28Tv6FaC%W_s2)_5#gh=6SOi=9I%}`G{nb~V|p~gNBXW$kE$XglKW|U ztXL48c;S^-?oW@@egRX^Jb~ia^BX{+_0;fiN5@V$O>rdm*Xg_WW=Gwvo%d!(f%}J^ zy1a8|clXI-$1Xha%P+qA>a$PYe(kx7XO7L&=!if8BSd2zhN%4H2m+PF10NBhMtN0y zdM^c?)4+rZNO3tQ<*^X}Y$(-5Nhv>_ZNV9LpK_vf^vq+={`^<(fBeaZZ=XHe(lRwN zGu_tm`s+wy`Q1O*I|%b-f4@e`f;Sr}-VwbEX~FJN?9%BU7#KrDLMaYm%RUA(u2u0P zrV7O#*|=hin=l$59@??Jr9Q6^vPQWzV^s$Rcz>0!{0XkGs7ASWxO`GYlrwbF@E^M4 z;Hd|RqL~`$>=KwB8x_e#Xhy}xCn1bIJ4cG=y`W*Iv{+c^oV%KLC0|;=zbNO4+F*Vm zrlik4FT3&0O~DKMc=0hhxsfSFT|>$*0px`ZSQKXgF6$`srokJ%l`dy2M#S9 zV~-mXUM7H-7k~NQZ$3xe?RQtN^P?#M67B6QZo%b141WuLcL^gk-lDpq&}OBpOLy+B ztS;TUYVzH`zW)3Vf4OnvZ*ToGtGIq743c7 z>Zu4fHYp_|2TSZ+Pf2NQeQiZyc5=u*@`h|o=#-|`--pxW^ zU9iezs%dCyh}A?Qv6hjEv4OUlK&a;uTeW*;;n(y@QjhC-%@j7)m)iIXE~ugD~V=#W@42(4jySn>p`07)@;kVT`e#_HuQw z_YMdN@PLN#q~!#M5tY#0!-I9ZKc*_#;%w`knpmBeA0H0*g#`rpZFLJRDz9qF3QI32 z3ir;;Pb@D>Ew0GTN5xlOT2!o;r?t9KQh9btLHeG){f8D#ojozzKb|lfxm4Y-?#@VD4$I=MuPgZugO?ek{y(?>IWVe<(&Iu(uNV_Mv``M-EP(SkV#~%=9 zMy7@qJE~`hGnf8>i-#vU_L6i)YyQ~TM<3^nOWX^JN=TCnigSv2etS`_sQ9S*y{cPE zX;P4romNm>T`8+F!F3YdO&4Q7fVE;Kf3}K#6d5>3*8^0ghj@yfHfg6CHjUI<~{KX&}KEoDtWlNxTvOv@(5ddJK83vFk;Dt zF)KGeUv?C+Fk^}ul<^k9rHkSAecm7!m|asysScN}DNjTWKrF8)iG#}t z{F74X5qyhtG8_-k4-(=BaLd9a^j*RJgc}xEpO$%PvynUGeZoTIHiLgkxI|LOkS|EQ z_OGwrfAQS0xyjMd5&5uUklD-bQS3IxOB;p3s1CfLkf8&(A_hk&3LZP^v?4=lFjt_J zpPh!W4~YOSS%8!8SSDH)DT+a3qGMD{5`x@o>f6W*i|AgSIt}goGJOAm`GX5bx#O02 z-r~Y%_V}ZOoj?BRZ-4(58xgGVv989z z3PsvxZeayo`xYO0_{8k4mdeWRj`C<{CwK3yaY@+nAr(kJGaI*y@rkL)Dfwkp)fHTs zI2)y)#Eo?>pZ(HGJl|p7_8WK5o82u9|`Q)*&JTYky1E2mxbY z0s}`fBuEC_AeeCg{V9!f4E2<=rEA5}~n{ip!U6nyraS{6F@FGv2!QovP>MWdG zdWgd;4EQ;X%P?$8wxjr}w`&(wmW+hqd_uV?QQ~Jtx?w{u8xfwLouWkvcfj_*Lj%h4 ztI6$3`rw##d;&ezrI8T{BQy&WE*yV}!=hvZeC7_#6MUFOsd5zd>nZF>F6>1SJM!Yu z*UL@)1@KuPg~1cW_pnn8NWkH?i9N(UOYHM+i{wO zVSK^EM>z_^l0=rNhj$)A55R*n1LO^GWvWc4Vr~8{lw7n~cn7BuSumV`sv#MzQgB_d z&Y-cW`Qr~i{=yq?fB5l7@4a@pzoTP%baruD*U&SszYe0a?C-9yE9{@RHQZOoURV4= zX`2$f^AZc!l+MnP{_VAu*rgO#R{g8`jq1NCkJFl9+(MLJ2Tcw5FeCMi1?SsSR?7*S&AjRhV9yS304NMqnK_c$QbMY@u@di~Sg=b0 zp;atafT8ky)GcNUihQwD8pc5=S_&0uT#7I`wMbrTSXbZDvAw;ewyKavQEuLwaB6Lo zIn;#0tqO=abaVj&EvO)(Q#>Rsf=WDdaD0JHj1;+ptbmHkwJ7k4k8Z><26vYQa+sTx zM1KX-G&%Oz{4|X}zF?JsA__i&L~&PldFjs0AO7~+H=aCmczTS(zC~?#1b$ojfW@BO z$a*8K(@PiJ{NV(Y4x|n%5#m*cEilP1C@Qb1t;S+LKRZ1c#qE)}%j4qJY5&E)Zi~Z_ zaS;<~7!etpU0Pj(8bq9MH`dnFvUN_4?K{bWH3#Y(K6?E4v7-xk=^CFoe&O;j-~05l zum1YYzkgt_@?Np)_y_E!Uv)qh+3?^ho_ zdjfAyr{@Mbp?FZh(gNJTNWir#+L(5E8`r9hY7~M_4FnNaVTJcQvfbw5@ITFuU;*fe zbUYG^=sI15!)(l_6j6#uM~EM!9OI;WaPIV_XP$ZVp@rFzT|F(eC3$!y%*o8ik+_!> z=cH#AR+Yk$<*JXGanJaI(vrM%>_xVQM#RNM1bI1Gnd+*;W~(MpQ`gktbW^ppG&MA} zwDFBtjEoZ_bBDm}wuxh>PahfYsV=N-X(@~GcC`1z;EwuxaRZ1Ae`0(JE|4nf8tSVt z6D)!}i`)_nXL^t}@)&8+j-nL6#|*_Gq;GB3uP^D*-CadY!a&B}`1j5(W%K#aT0 zgYjg&?o+75!OO=nExj}^F)_n7-FLIItCNlO*35EAZBdA>gO|ILk6W;PUSUaWw3o9l zenBoi$q6wD@%f>}p%H%Z5s7$JiOsE!KGfMXQ2X?unc9fp5H}+OCqEk|+s?q-*_4Uc zl9Z(7>(013s0VCKOr0J*FfuLE1^J-?APm2ky2VGHJ^6o9h?X%MDWvpg2`*C(IJ#DJW_rFXptHx|-^4(z33S4NrbZF{STie3Ixu*`F z|KiIpe)l0iA8lhi)gDqHhu8KxhG%z#XBE<{K4Cc&vbN*;#K0z znc<ZKMQIQO<$8r!tj;%RP=%CcHQrRv+E~q3(aguc@GFP#p z7v*G+sfcujC(`kaM0#lP=!nt)aNt2AZ6YH1rqjcMeD29;Hp*x5FNE*5u6M0eRClPL zKq~oXA!$WLfvB^pc@KzGlB*)pTSxgh+{DlZBB|$5H84feD=>#s5$OU?B=OMv%*otb zDKrpm`b9tz66Zw?*_p_oU&~laUrAF-%|crj!sj9StV?{5g~~;~x^e6Jl^d%VS&{gWBWw{(k9UpvV{&)}?%ep-mvs5De{5)o9af`W z_(66rx5pG5QnqvvhTt2a=FdXBR$$a7p*w`4%Ep$)Ds1S|lj4w{fd^j%cFv)p+*a)^ zA$S&U35~?$Dipm_sfB#uZZFy!L7_UNPBnJ)kIfvIo14Fnp_z%X8FWkk^1V;~fJCH! zeSd{hafrpQnuUEqa0BruI=EVS5JJ+GrQ5e|T)T4h#?9}(G5+%7S5FSMBD%dA-6+(L z0vj;bp=j46@zaL?wsLTV2@o#QAg%|7s^LDjuR!SuMhLli#l>kpFtlpx=;;deeAA24 zlCeIIi{+x(7$%yHvcqj%YF1%Q=ivOq&%gEVThARI+ta_Zy$WWp7{OIUtYiY?fV>Q&p z8rnL#2Aj<6{F5ttMh_f0INVcT-Q3et9p!9c?G=`U>026ZY^Vt>DZ8|)wyCwX85}At z$V`j~_VW`51z@uu!s3lh5z2)tA_BruBNhrdv?ajK#Mm_^Jqvf5Q3z=a2}Vw1fFDM2 zj<&XT4lbSuWu#G@i!a8x*GIyqzELn|NoW-T0yzzR$WSe%Cm&Fp+U-Tk8S(&B=! z$8m7Mx(6M?9!ndfP`GEHk6TJuer{z+yqz_prngnkN82a9pt;D?#YR(28=f)7#cgY8 zM35G~r-kZy**dKWGn+V1vqLuFz$>-(58??#z4Sm zsxv}$ftV4Rxb2#KTME26O*(3?cJ(6 z`9DvuY?#8KvII9HeAYwff^~SruEZ=w6w?8Ne^SbdG0|+UVTO z2^RQu3F$cGP?xF*1?B=7LTI(>nmhVho2n}d3dA|NxTr7q zMzUP+YQFRVO9A0W8DGUMN$*lT3C9-;PiPfjyMYAybGz9*p1=YeFQnuR%U3 zP&|L@))lbl<~{bT;u4W6=@oa`Wu4nszW&V{Pn|h9F+7BmS;eRj*kK11d(B`bfR_Mo zc(}Q4ZQ`fErI0_Xh1U3NLWf67M|)#+d2vB@Dx#DqvkK3+zyQu)+YifWzkuLS+=c4l zDVR_Q;=(b3sw@s4F__cTxqD*&L2lmiAl5vKy!4rw9GgCN;l(%K`{eh;oO{xTy&(s3 zR+Pxm-hdn_W^KB1T$+FT&%b~3k8i*G$6t;A`2MRW`-_6z+yb%HM@bJIo)B^59Sm+y z6s?LjMT;+b=YUXrY2XS5V{J6@Lb&7=m!x^?iq!OUb+v@1p}7)(lst2Bv1}X@%f&cE z!$pUcPfDhws$=N*bMO7;!&gqv4(;i#%8Ws0uA9eZci+tpR<^z=MV00G@j)Iz(J8Pf zC#7d+CWeQ{rsX91S!$}QYw76faymlD98QDLVzm`ooVI}eheAC{Lrcfd%+ku*(JLfQ z(z0iAY)@}%Q~S2dIx}E z!RVjh&N=D;x$il*8ePw>!QMiy4E0E+hBNfdM{l0f~|<97)>Sp|)4Fwp`MeQ(3aW6xEk9zi_A3K z3^dGI(M>qLFjZ@%&oNd``bK8|8&MHQIwP1} zcmO%~{RJD4V|(EI1iu2EI)l)du;_yw0qD|+-J_6 zY0b&GP6U*ol#!hx;$ZYPIZo+T_grYw8Gnr49-Ex(?d>`=H}~d&KYae>A3uHfwdWo? zePj;2*-LjR?aFz_I&U~0H^#i(jIY6}sKi%TU427CBiF<=%i!h2Rd>TCir5Bps8*P7 z8;ACh^2iC}2XPya!+X{C4o}Q3oO<-xSKoU7qYvMF@hK2zZ0wo+*u5_<&i3>S@k{uX z*`-U;OXzl)Q9C~~GkZ)rqdz~muWwruP7LUszPeg=LGiF+QneVWB zP?3im;YY3R5ayUmMOTWM4FuY|Rw_^d=+`O$^=|->X?7dmS4>gA`)20(5c-!MUR*wL zcTo*5F2`}xehWi4HJD*5icvyb9hreNvb8#c+UAZOt&P%1C${QCTaxSeQTnz4YkO>Cxd~ zZd5TQgal%TEC%<&0!_XHgelS_PBj!RDPAqICnsBBMMEpLl(jXLr3KlT3?-xQJpqGJ zKxr!%qK@Yx?7pFj5S^_lWlgAU!_id(P~^_bpRR#@2M$5}+(Xep9z~DdL(z8|!hiLuB4bw zu0sgz!?tQ8R@Xd6?Ip9ViYSi~kM;#rL1 zumfV_ED|ApYPan>d->NNzJ75Y>GUDaw$|2G);2yi*5<~h_Q5FyMcJ50CZ%U(Bt%8U zrzAxMhbHBhrumy|XzCak8XD;9>FQ_$J)E{k3*v{YCcRn=I{|Sj621#AH=< z_VsN;i`h2({7#NOG3lA<@eyGWu_@Vwm00JtG~+|4twgzf9NM>nwy1~ETR;TudoV6k z#~%PjZ%9N52?`Aja51xR2#QZhNlt^io({!e2}y#}Ffud*>J%SfQc6N(h>x2i4s=`) zxwr+BJm26D%Ah#6*HeFwa@vzr4H}ThE)SW}a{OugbBebQoWCS8FR9gAjK$p*VywG_kNSGh-M_J4ts+R7RMQP>Tt0wXm?< zT-USzwX;8=f@a58RokE++CSyDL4+iwDH@^$>!3O6Vi*`0Jl_r`9lE&kkm%W&?HI+e zJA@ODfJu79q}~ahNuz1c%4P(IPThmjnE{zM3xev`q zQ4q;|!Bc7K9+lLgi%uLHnOJ^G@UyuGp`;m=7KwMf^!OMqS_7M-G|cG=<-CPMQ6Q)+ zS}POR%~7t!mEt9$60NH8iko(?l?W<$7X$P58qPO$_U{Cgu#SdlIA$f*G_!RNwMX() z8slZri!Yry&Ql38_$XFH>?AuumA{J4brmEkDl03JRVu3VtD8D@G&fe35u0-I3hxvx z7v7Nk8Di)c`7$v2{uPeWb0Ee(2pb|6$2W>)F^trRTa@2r0Vc|0p*mws-=u0vRm3Vl zCTGSQV{5$-17FwJy?5$ApoBD->0|3q`rm(k`~8)x zSEX1Cu`r9n2dA`IugfEFcvZpggqCjKynScs?(G|X~IMM66v zwnG6Tkvs~7*_yseuoJ>44nFHjN*SPOLrz|4aiR;78})QG#Ui)Ff?O0q5|R?RBozO} zQ{;dhou0+(zx~mh7so5MT5FT4u`mfX#4ydu-XkaqzPTLOw=;pIh-f72 zhQ(%=*JSt_i#6_H3Ckc2OM7iJ5^H3!)bwhTAG66>mW< zFh$k7d-(?Wdiq3X+{_W`2{t-UO$_YZp{bl4IQtE|pQ3D*KFwng$(r!?NVa34&R^)fiR zZ+`KSCoccu?GHYD@8L7VB}KcU2j6xowy`~WWFViNJ9K#Nz^kvm_L}TGu6YhCsudM% z`GM-?YD0Wo)0P0jpbP>Imv?IrM4(i$qJYKgKgIc~;a;J&i`|WI;cRhA4&J!CZgndv z1lc*apopfShz^&tc{kyx7Us2%$V)|Kc`o^D1=l32g<{%wsd)4ko=3y~l}GpXMoN*S zj5HVDEo|gA`PmD^w2{}B8|*0zz@%iuhi+cbnR?vs3<8YK(0q=Rn^)FEQ5wsng~+u z7XF<#B!7Z3dIK_09lt%eSWkTrNHYE`6n=&KG@{EMvQr~BK$RB5u4n-zu**?k7K;jB z%3)uk247aF8rs3)z-uf{g`}H2l2)$CuHJxbf=?U%Gv?;Cn`Sp|-ln9jHT0qU`>PLr zeqjNYnXz#kEGk9?q?t^Wa8gR9&JHx9@ZpiG#bz)NBDji<6|sZ_uq1g16To{&ks*Fx zF$2xd&PbuCEI6Da6O&SlTX$fbK~_0b3PbQK;WYoCVp78CC6vGY?u);u;B-w!PHmht z@drTn$V3oUaAGJ#{65g|(q(N`vGn(kFZ7pY7naf68?K#Uki(s82ZGKzc&A)j3)iGU zXre6Ykfa#A3cP>G2&1U#eViHalf_DRdnPKrlVf|rxErCWdx=PB^=PWp>bo`$@V?CNynb8emK^@N=yx;`~g$0aDlQa4+y?q%p?Y_7uyjkUKhy6(P~ z8jMZb*wEyj*?euWwmYH=e7B_QY5V!wG8)FALMulzCkG4{?Y6YH51*c$^3~8{;-WfU zotznLoPGB4Pw?pkubCd?(=tEC1D_5Y*{GSi!Kb-H#HVN0Mbp4z>wMZaqT-tg)nT{C@g7c1f1{{*VWzA)7!gk8@FAyU9nBkYthq9ZAwZ+ zQLH!rLI~lN$wE2FQhl%l#mnJ6Ky~(PM{4od^dan!UU~Dq4?lSOwKt9p4pIg&g4`?r zQGLFeCES!j6babXdM$Gtl5mnbNp@9P!P5fe6B_)k$0ObiN@G*U=J z1r^Dt1QBEuNQ;@#?{ja!?>5812q;{rg!TGv{xzhv(jkhVWm;AyE_5ZA`nAHls-ORi zQZN0P=hLoxe4;%P=_SPG3m*Fq!DJkj6pFC}T4V8LN*#t+)BsSL%9T+;S>9TyxNbyg zg}+j`CLw!+B43o7*tl)27@CO)C3yEC%DmAzxcdP_rQL5j-nU1EDEK)~EG_Cx?VUMQ z&QmF`KwkVF1kp{&SD?@jh_=DcU#zHK+iBE~V>aApcDJ_F)|bKA(A0FJ`9U{mVy^_5rD75bCc&+J>lV+X z)oaUF?_68s{m@r#8sEWBwIY?`EcNT(zxDLV`6-+Yak%_ajH07!*nEic?ssDqOWP!T zP9eP#rWz7UY>6ikNm5c#RfUlwO+b|M)klB^8kF(CH9wURWac0)5mg_;}@ry=U;zZ(8}s zhfmIQ*J7;9e`U0_b#%(RXl$o|NYX)H7hH3cT2O^|Dn*$t83O6psX`KAsmW>E>xk9$ zqOuEeFo1;rJSjN^MPmpG7uM}O{nl?^-yW#WXqnl&*yy_o7?H`kaTCT3HwuVZ~!fR?OAdeCg z=<_)%Q-sP+IOP?X32;$rk>O|uid?n_BoLAYmCPH^D)uW!Z{KM=&;#6c8-k zp<99zBn{gJCT0&GUD!X+AjwECD6N16iH?gYfC6{}ui|1NwgmVg$H03_Y6b%Qw}x)@ z_j0gy+)Ng428M4PcQl+I7 zZEyq>6z8V9*~~L3DIzqzz|mdExE7QYZ1#=|Hn7#S3`?mjpYCi*GZoo|PWEiJ6dGi7 zM|&H1=m-0_Ws4Xm3lA+*m>!ZDkt4=?z@J&g92p(g^xXLFnen3@$lr-VLh=6b(Z2Z?p7{w5Ju$wfn%#ZR>!iD#YhBCy?2b5e zOvRyY%Y0Lqc$9txvu~IB<@~5H24GLwiXk0Yier56jLnyo*64l$0c*>D}sx z;4zR$HYdMFqJ8@&Iv*raGDvh#&fB>UKPJ65yp!=DYTF2+cc+#RdV^%x_U>JDugXn* zIW65->WCnG-oqg0b<*Q6jPoQ~n4dp%_Os9b_?!3Nc;V8Squ42tn;TijO?0-g4kCH_ zN`@VD628U(q6+$QYr?A^IMma-ZTt4V9XodJ;aHQ%k(7X+xE+Q%9IR1dnA_6T!X(3KWZI0lts37?e5i^$P`#bkd84nMoY+|q?OTE zAHIwlkqHV*Rs(jBo;e~M9vooz7%Epr*!L*omdbHuEGWgC)f!5htlJIrOKz+#$%CZJ zz^Pb1#$CBwo^~$s9F-ZG(TeEsxcuh+!QI0E z068o0Fi^9yHtg9exD_JiER#);6)TCWP#DQ>{pHQG6WvW1zEKB6OFNQs9AKL0LiRr; zz)=eq)j!MF(ZEF2wOy?os~gA{3R6PY)H#MTUSrtaFdCdg{2j7$CTUTZERv` z?;V+5R3`~_ggA2dkI%1a?&$7pZKy26l)kJeCp8wLCq5PSC2i*ojbgm{?Phv!!0Cr3x3McL0E0nHKc@jy2v#YTolA`LnlVbG(~^9#r32OF~zP&S>F zgZT+xlS6)WXCy1&w*p!z5=T#HqKu2&60rr2yC5%H3v(B&j5hmj*7J08cCfX!bqR`- zG;Bc6!P)&YBVj&{PS$FSj<-WBqwZ%MZfoyg0UlV}IJi67ghxeZg~aCi1f~^2A_?3} zavjV<;-M)8`iaGRhL80*Z&hQQ>h|@h=`n6Qt0jIe%;q3(V}&5oZj(D>i0zY^o!DlR z9^e=Vv znr(LNJom_xFMs+urgXo0`Kfb@^V8$Jp`o*_Sp}bbQb9`ikP70%bErAE85#%@XdB40 zvws)fR=GXQ06W0p_)xLShR@%^**gg$C4q4E4g%#OxfW_jn(C|skfgYzoB)KJ{vEsa z4o}Vss61}1C>Jujgtn_9vj)cv!e+$@bo|@ough|#djLB zg;ELnUnv@acO~<-HT7~F4dqm|V=YuT{O{b`d4fy{uYD>eK%*-K!u;Afh@N9rBzic> zb$AOXjakq%E2|KdyHSC~_r)@5@xoq52_)`I;HWF5{XULP-f~S^@2D%S!9=d6mn&G2T%k)O%*zzH!tA{P}OL7B{ljq}KSPU7tV{MlKxzx7xwzt(m z099kH@m;f7QwtV=ZCK^yWhTYvlwjM@&hbZ7#Ua*%-rPWh7cku(Qr-xoFZGYZ!MixHmFFOfo&_ zSC?=9@bw?weB$K6eH;vu024a~Q}@WwUUtAlsfBRO3O@s8bL5yQDV3Lb;&ZC7q^hwU zbK=g{+OmSIbbMaXev{vL;!&9tPv!1N8O9SZCbwb7-d(-T)fG@H{~t2F3^JkGWt~ij z=0W=x9TpLtDE&d}KAn~TCm|puS8P&n%isV0g@u7O2sV%jOQQ~!{4rgd_#is$j2bZ$ zBr4&ZpDkrbrkB{^lesLzPfvgenWj+Fwg^5of)Ww|p@veDxfBHg>eT4FFr}GcLA zOrDbMM_+uj+nW(;s*3~+$7E|7S=xIBZE<(@439@qwxq1Cy{o%-$KJu-e0MF3hpep3 z%}k6=()g=>&ROn{9G%cJuV{_tEokadLL|kIJlU-8H@eOSAjNcC~xD z+B48Bo;JyTB7vjPW?R&@xa(;c8jFS2K}nW+7QqSrrf!j?j*eo+svv2zd#s0#odqLu za`(3ji1KF`x48X1{jhq+^$n#3S_tv;=w*wwt+niQY#2d+h8JV(>8xuhU@QuHcMcp% zcT;1$<}2+O#@{$Ftk^h!VGI+5T1LjE`Y=Xl8;R94Y#gmNi5Y=`t(~d8os+%$ix+=F z5xw*PmS}Ud*0sV<<_Jr4+&YI|uDH?56Tcx&quk32s<4J;`ZoE~}Vqu+jhZ#XwGI;b=>z(9lRHN1F&O0x9T z3~hNA7MM`U_1H6TpQb>0Cvb6Y0^;NSXf=RZAW)cPFhk@VTDg6nDoN~NTS9uc2%&V z6ilF!90g>wK2nkip$llEgv}0Qx&tyvSp@yCJekM_AzDHU8F!n?2jsU_RB-y?s_Ytb zl?9;WH-Iagk*?e{zlG)jR2Q!-p@#m0%jb?#)eP~88xzwvBZJ()CaNF9XBOX2N#i<% z)vhV=R94%H&&b}M_J#@xv>*g24iE~FnFAF?H7nFM1Jf3+l5=W%`un;Xt11vrh!db6 z3#a49j^NU6Z0gvfgs0zq@ju`E6aKlY*YL|#;IAe8Vt<4t>TUK@NN;}q?xmR>*h}H$ zfqIbuOw6ylyYYsmB2yEQNqGZNDuVwaHj!MNd{0Q)T)r2mYUyn>V<=8$bVxbLM?q`OSizS-tJx@F)10TDY@0%JNkDG zPEGGAbcLB5k`-0PYiZ5w2KLH&K5FOrq))j>YCOb@HRNR z8rwo<ytn&|a2QeBR)@kvjW+574lX&e-<~G*Ggd`m?W9;Z?iC`s0&)nPw zvdziu$)8FcT|6x1J>N>Dw2mY)*a1lcXH`g|%KO1f>qrtT?pf=T?GWynMqj1D+yQ*G z?Btm=G(6f#Ogeo2fhirgA@qkG(ZFN8Wc;!1v+G~v zFpsVAv%1yS)}WRMOYO4L+^h1}1WGI|PitQqI&iqNU6oJ$#k3r1$pk;;$lh(O9eo3c zW0=Ij(cy)e8SZ)Ecv~m1)ad-k?1hWJ|NQgceemYx$Ca}>ereRwNNy$)ICu*pF1f5v z>d-s`GpiCykV-_Qy@2WP2wm#RG4Ushmo1+b20Bq=75|cp228%b5HoFnjs(*NHX$6i zv9*KtNBqd{F^ufq`{13|jz0dEYT13kG|Y~}KsITHbEM&&eNAytj6s5v`Y6iPOOQP%|9HCb3qtn#u zg{$Baen|DatU|C@#T7C|4D`~fN`MKP=A@NkH@+wK-=&H&Exfby$ZD^Ze!% z4WwBkmo!IEU9ct*6g|Cm;~zH#?;n+)x_(mY#NeT@4H7E8X2*}1HFbbz)}cL@n~7PU zptTvRF%nNzihd4YR}6@D@9NvG)!EU|0R04&bf;OjrMaV>rcTYx7&&nbaP~KS4Tzaz z1z%rZQwB$DMm8*5X&D98IQ0q2{rNdnUq{h^Aj0&o4@D5W)$-!j8wS zsquN)WSbD&=0k&)QJE>YevQ4#UHj)%3KNyzxC6f%hXoFxa7VDT%&i*Ux%$l?kW+VX zYMdvSY6v(wJjm@e#Lj6a2FHZ3cJk=JI-o#zJv3Hf5f&jmQ2Kq{O%(+=gw8<;JpM2x zd2|$=kp_nz_7;&*5qO`-sqW}Qg+etPaW(%9VvEO*A3d~x-#F}ful)LhPk#61U%&a+ zcQAp&ut5x4LD-(Ivg=2c6Lc4oPAQbt@^_!T_OtQc1|X`Y9wX~cyak)B)2j(*QoIol z?{j!TVqu066qmBa#&J$+4CIZvz`(z{vM?K4oA@M}^KnUHOvV5&E>%GA67k!n1g*sQ zw36Nv4{dkXmV;jLA|yMQx%dTndw7S$BxCTFS>A?JuD!E!dnGQKjIJ@rWxUDINFPs7 zHEkm^YddFWM<)j>V|^X$oYZg^tIrv3)d#$Ev2en@lnyc*kZPmn7@m@Qw!j|?D z;47T68zSS-LC#6C^0SjubILk*4GkjFrf>I-*1|AvzD5USJ6IwG1AczEHX}D5Iv8N} zkAYr`LLEeLO-WLCD177o-VRn4mex)P-L})S@rW$y8QHgQa%^bNeSnoz?d~rvHL&n@ zRcBmmt)dLw)YWV>y+R@!TsH}<9S!X?87(cwF2vc=8^QJ-aNc=3JKDNKhS}%{84;sx zfSf?aHLU2wj=hXfD|%OJzPX>1nXiv=Hg1k0ytR!5LT@#bAT7pIfOiDPn7!luB~D_2 zd)J9W_NI)fTVQOq$7cL~N10jKIy$6Zc;kQ=5kXEJ&-|fF%xsx@^8${8?H#;-h2rJ^ z+Nv-Ige`UaQ8nzNv!zw2D#~h*0$~S~2s=7=H?g9zO-)~yCwpd)9m7f zm;d-jS0^!deu821hA!mbJZ3S<;l@(XFs8BUm@VAE7aizdh_oPqRiTgTTRPu#I_ zZbCMxm{5${(@XF$Z}9EM6Qq}(ADD9}J6Nz70>5M!U^ptp74q#UTBxb5vj;J%=n6dk z$P+L9;+^;3`_<8ph+jH%X9!y}q!n)5tA()L@j-QEz$?bpnK|h_+vck&Py(BM*o1kB zCCDzm(Jh#*!KP`ZSjuN&uR>fkjw4O3Vpo3tt%570ta6HF<>JaI@*ezvyIPJO6IBOg z72=1gNLVq&-<7PD3ZbmHB0x6AI{6I|_$Dtb-E7XFA{mzJLrUYdCT zURlt`h;!h} zpIN@-Q;wLF7bnpcsGcq*&9SMDL}$OLtj*K1lpxuFHY1 z<*UnA*7zwQcjKxOU$;$REni*Z71)cUz<@7`T4l#=$58mGJb9wGCz?4^j5k)ExOJ)U&G_V3=^*IJ46Lr5^3Kj70nkImM?L>f~F>Y#>)&CQfLTI;u%WdZ(wj0eOVDgk z>6RdR$>5{cq~hVa=>`Q!MMP)IC` z$S;u>YKixJHFb5NX+$*=8W4q$pkkOXArS!M(gdj~T(SZZhr{AZFE$~gbnl_*iYO;N zMx>Fbt)Zof=3_?$e0q2VMkF8-D6brwy!M@w`})$+ex_|;gpJfD^6ZHjO+zb3H_y#p zNKvpe!wO474SOqXJr)#fp<`savwC*#cDd{Zb4yT-nI_zfMa@bZGBa7R$?q} zn*#lV05FW~Xobd0FpLG`{~u}Z0Up(1ZQ;(S7gUfCMZKfmdlzb`_fhW}jk*LXs0)M& zY9ItEbYmOSjWIU1F^=uH#Vu~BH#f=4jh(pAtE8E8&RhG;2!u`U{oeP!nAi>kgwV`? z*4k^Y%_3h2D>EjDG_RkJr>ldlRd`WjLv9?>{X{(6FTw#Lyv{Sza>{D9w9(ns%4$j8 zW?x$?dpiB;+16s6;W}$n zuUhK3#g=s-I@Q(LzNO(Y!>mhNnlrQQ90d;gD4Mfa=eACDjljsq!*#uFu)UkRw>@f$ zSb>+{Y6q{N(5Q`;0)fREdn?m*Ys`?qQ{Cumi!jG}fl8?7b4~SY5W*9;r)yZc+O9UY zchVAA*=|xc6{uM0m~2?5Vq}S|gmYF?guMZ zf5Ec3Cs;NBmeucnl4TDe#-7G9G(DWrM9p(U9aeFNu=Vu&UCb^s-X+}LjRvC8iOI={ z!AkMr*G|147Gs;6b}_^@eJ4-7boI;M|L%(q-@JJ8&@_A*-X)|Ke|c~M>_LS?qCF2Y zzPv%M#W1$wr5G>7VCD=$>J5*K2u7Bm0WF7z2I1@QMB^Wc0W=z7VU-G9`ZU6lfoE)- z6L^N)ItBXVBdo1$ojp5tO&xmv#n<2d@T2!%y70;?^cGZ5P*n7ACp)A**x%c-rI=E8 zKv7mUCz9nz@jAym$`%cfrz^Z77239{R1ej8G(H?1$>cL_XV1nF#V_c$0X^Vv72|8w^ zcCdu-mU}DjZmtI3zl3K0-%I7%Y}zm7=X4u>{{A`PSeX=8Ot}Cykdzt0%_x}Q786A! zZfG*v6dQ*TOllgzSt&KQ7~Y}CMhZ*C0XM@ToILn(thpAn$+&IS~$c9G z?)F-={NQPW&fwBJEB=`}w&I~BA|k>xvAUB|C_%=pge_bnM_ze(RWp#cchAp|H#R3n z-XH(^KiH?beit)5>8&MsHV_{t^64z(s0@B1;qK;N-#fFXy%uLE)bIpZjlk@p9CnB# z(GmxpG{pxC*kxzoC18pfm?&2y%1&^FI1nl!tG6M#Feg1R7F(~e3|?-^IJp7TaS2NC zoAIwqtO3G!NUI~NUe+VxM75Rx~lFvD`z)1fXLq7%t&8HQ%y;ztgfvq)AP{he+b`jq=Ee^HBJ5X zz@n|OskObUZ+K!>t|%=of^rt#a1O&TuR?cj+-A)Lx~CTdy@o*@nqD!mBZoK8-`CCF zW@B7sbDby#Z;QBZ9ULB$l$lEfAvp!&1_X(l8>-5Si*uqpZ7r;wfHn_LxRhQfK6i0O zO%dl{>*$P{5TrT+!|>-8;_vAl3XsQ#`MJ8dI@%cNt~N0@w)W6Ts_GdX?#45Cy`=mx z>~iy}#EIgtP;*OVfxt@70GSM3fxV-*qm90nrdM=uz((h_h8S}>x_WyBM%$U-2d(vU zHPP3#w9pf-N^1@lO^XAJAg%fuI=!?7Yd1+Ut=w!JEQO{UGzAWxY1){sxjB1yY_L^w z5NIlyCe>DN3uFbJO2#T$_9&^aT3el)A1)B+c|snWPJba5Dy?dKy~oC6_;*bz$h*IH z+SJV4%+l@8pFat^9k+1;Zzbry;FqTs8u1^wSX%+Qp1z^Em7rT{U22nywW()TfUdWl z2i?)fpi@5I*YzlxvCuE*VRM;rolEmO;Q$T}?$}Y+GPRGzM2v*n@nz?6{}Zs=POzJ0 zkP;-}wgBhx;Tw-(*RaBQ{AlDMg#<^Z+Uv35yA!PY-7Xf?F@vy*6^Amh?tpC8a#sxFf<)YPGkT)Ce9H? zmK=Bm#r$xrr5y(3I5vMTz4_jUAHI6w*BA3e=_#r4dHD-SuIr;qiKv3zBWljWRG!N1 zXr{zM;%MN1OHFS=Vr#KUI9^0^aN&^X0Ty?cGK9k=(mdgKA)9dnkV8T|Q&>BMgkV`a z;)dDRkPzf2V(EE+Uh%L9arhsg+tlb`SyVVBhaSKt%+322@imSL{lL6&(s?CB!yCDG zbJX#XWu_-3F7s~6FILXG<473t*t)#dhTZAJXqJjeE2y=v+M+1}?p?=U_cy>-fx??=)H0LMw zBriLZKpjqcV>yD~$C9J&(yMzFsOvqkhfrsLCMyb5Q>-RAsj#xKt`PzcTdK93gsT=n z!C^10Lbtl6ZEHb+2!P|Y-3`fIo_O?q23186hlw!p;*zq<-0;2=ob|OtxvH+dhLtEq zl$YL=uz;hi5@SI*@`PwtT3S|pcX7{jCGQxd!f*1ic~mw3k<`^0hp!oYxGUIM0+vc+a-EXggbsB7uy>g{cZ;-j7jJf`shq!gS6)1Z1E zegoGE#dv8&l6pxg9@7fZ(E`a=UM^|w|3CN#!}1Qo{IW;Yo47ar z>zx-S+Nw$I(d~IWup$`0jzk~ri12%i)Fw-~hCr2NnE`;=xuTq`NK3pU3gHndnX6rCy(?pfIiiVD!9;45# z7V52HP;(*E*r`ac+}M-BqYhl-I4eR z$yo&kqmjM|3~;x%b5E&i5NF03H#F<(Ad8w4!MrtK7vo8L@;u2NWsM zT|ds<$QAv4X!eueW^!_JadGv;QA0LjEshtu1;pSIMzEW+yNkV%_9}xlrrsGkE&YQ7 zom;VATAH7|l70EHn=4{M?FGozV8=>XTM3q;l7(Kaxp}aDn73>AW;@Gu0uy_CH)sDC z3$V}8BF@Lc(9qNZqp_^X)WkFUqV!et1GY7GB`FJ4HYP?{Rc`VXIO=Uc4~Ad7G1R%I zse`?Kkg6JnbNcZuJMwH9fd~E+l~vFZXi+jW8iO@t_chk`)-Qha)~{ZOMrDSD$?zYx zVAU()qqC;w=4KWyfBvthpl|euR55D%zV0#l$fsP~A|&)_ApNnWx4)-vhirvS$&+ss zo}}Jhl6Y-$n{s={!0{!lWl4{5d>mf-tn!&j0w1}Q4|}+C>Mx#q?zu~sULIwtl^ePw z5`HS*%2f$>Pd~;V94FFcyPv>cKk!#K&%n226!?39nBp(A-m4EselxNFt;g-v7$2)^ zP+WETuU*^@W{%mxy>58=)EjSHz54p)W4QV!7B@9@b|R&S=Xhzm^;w#{{qCFJesJ}r z69=b8cW&>I8<*5@p$LTBOK?=Mk1jPSY)fA0;d)g+uk%1YfNu;pa~LFCxCw6Df)>!o zHbv5`yAz)*Uha{7iPJFj&dOr?#>83j@T14*!V>ge$j!^)-3Rz!$cOK}Ia4d+wHzG9 z+#CufDnlz~OLLTSvoZ@+qSK(~zNJosp+e}n;oOH9s6EUSj+9FCRR(DwcQ@+}s$Pj} zn5flFVxm@2hkwRAZ3(gvyzR#29tJ6F!M^rE=EfO9mW})%8yv6)$ z{4h@i%U0qsX@Sao35-o@rcmeC#nQ5uc{dpt{WIS6jU4?2@0bwtP+u!s+wd*jsF$y< zt`rv(!PCJT5N28_sVSwUOC_r+Yq!;ii+Ids<@~eYW`XeH6oF0ki>c!W4jsCFQ2oF( z`iPNUM9P>nT)`H_soLS;Ez_vxMJ3?AG173lGXn>wnwx7R*vu3IR?@2fUe;!nn{mz* ziSv}W_@rzXc$QUF*Pz^_Rcpjmwc?UA6gH;kR#uTi=@}4{cU7Wag?K&Q_fqimu^GvP zWCgzj0vYCNG(r(*M7NzldbJJ!4l#Ox z62zM6LRp2hj4O4bb&b3tabsIo&-VU~+QRh2#1zWj;$aMq2Ht7$4XeA@Iu1v}I039q zT%3;`b%Z-;@wlRT%M$=InB5Q0k`51Ee&?glzajyLjLTh22nk@TD1V6q91yG+Hr~T$ zh6TYKnd^VL`rKGsH5HOLA;F<1u^Q%4h_ zdo@jbH$@p&8|dp0#aIm$O+@eYSOY7>NpRlCjCzyYu%6}bi<5#8kZkzSsGT1ndjXz7 zO^_g^kQs(8jtotrryz5OGRyMKyk0m zRqncMg}`@3r)Z5W|v z?&=X7Wo#-G*qTQ9Sg%`aWU@-2Q}%3Sz|efnIztVIfs(Bu#%k)uJ{xV@(+zBW^z{X6 z)h#xguNLT;JFa%{6I!aUf*`BH`u=!rfvT~SLlEYTx*9^~g0YckNIf6j4c4}2KP||5 zWnQqs*35eF4_m>oO`n{FRcU7C_~n292ZoVPc?&)zG3;Ig@{9beZ6(7d{uhQFqL;|l z-p=lxzU?i$h+%tHFzf^vCJ!(QF!Nx?wdT&?HP+iZ);$W4q38h|Q?K7L+FDh$d;c=W zo>7#h?;L)DW4*+&g9?tFTHxdMB;y#Gzn!mNmT?M>3D5Mid({SN`2$f@AE-83P%!r5 zg>kGpj&A7fCXF>R($1r-y>Dvn=<$6sv-3xxJgu&bJ^$)A-+cA)JFlL3W}<#mFs=aIS>S{sAFEHLA@>OI_yJ*i$%m_$eGy1;=b`G3hr%b|hU?UbjtBS&*MCf`6M= zP_TFu{Zx}2ejVN;&6iVbR8Fyd&nhT3J1ky7u{^xVD&*Og5jn+X#_r57%xTPy9z2ML z{Aw}m&2qK^ItxDIKbA>WQC*Ub^fn?P@v%vwa#vU1ydNb$NVo=Vaaj?Bb(N>LXY{7) z&|M4ozx`dJgnLJ9rEW!LvRHyHARJ$fNy>Fz_8+B7942tfOJJ1I|KXw50^;;Ef8r|! z31YH+dqDE>Dk%cBdDhm0A-ZXNB>}-ey`k+1k2z))ne^XTJDT`OB81m17+QPJNi3n z3R2;j)0ZAjYvIk6c!1LsP|{)HVaRw#r4zx%t~BKEIXMuWNjhc}Low$-A@PzO(j{0cuEm7){tT%9(VlBhsJDI%^K z7Aa#_MZ{)lL6RXvk82#x>PrGOJ&)|{JErXoAs!BCYE*ePqTvvv1$u`<$D z5vrRy`TBdEN%wr)N-VQBighdZ~hO zpD_p|i@_5`QbB$9&few=n_Ib>1+51p1zOfkwUvJA0-IP- zZJx{KpkRTzS;9zPaezRGai{K@gD-muPQ0LEVZFhA?2pX^vro@j63iSv`_ofkHU>c^ zAG-Y;Fr%RxVk5j4xeT-EtvGbp)6@T-1lfTVFl(5dz|3vx;A5I8&CEfNE%qpP_guWl z99?~Qwy*D{mr|?x`f{q9s|N-K2bpHgt!SJTmu6)oCEZU^Eh@`xm{?&?D)iY-ezdiG zb+?irLXeePVtfuGVi5u*4V z>FE#BZ(zEnlmUq4D~;yEsJxBYno<@5C57t!Wt0~YiN1%zLK>3SVpaR0#me#@X)z7C z7Q?S4D^jg!A+B9VW<+jDmcpkbe2D}(_j9koi=>kt!b;R_D9@JA&NC;vjcmLcacyf0 z4>rO12j{ehf_@>)V#SV+yvyI=Sjsjyc^7jAxgOZE4Mo&&#r zI;c8Ww}M`|@VFH8>fWZH*Yq7|ur+(8_EnT5Vtpt*IW8(oBsUHJ4jhr2s9aT;1*201 z_g+iItedhs`pU0K{v}buRF;zaYa~^*H7M%Z8XXpqiMb1e8kCxxeS%7+LZ<-NjwofF zlu%IG5wuLPB{bs#VoE3}WFHX3pqdsqr2Ewr7+V6uzK1m782)(G5`G}sIPOao7ZaCm zsolJR1Mr9uUSoMJh7>=Kuxr-^7^fNBf|bZ?v3o!M?aQ~$9^Siam>Cq}6g={`vVQ%( zUTP<7hY*uLGQsdPg%OAdF5uPBhL>~yHc4Je+-7*zfLCTRlb{V7E-oe#SI9%d!gRwT zVlqpsYb)@7KrctBtW2k}=1CD|I6DJ!4X+^A_dg-*a+gllKY=dnJX7fNF87cX09@C8 z|Jt!#ZS`WdLLFO|ybePv|2`CwB`9aJMnm(>63&zeZn29pbx1@D=6U(gL=yS!T2b>(A@ft~aIyXk!aI7jHCV#3dt}3<;0nB%35iR>ILb9Ky-O ziz5wAVe)3QX8<(*e%^jD6%CacSTzU>!Y4i$?25v`IlZ!N$BtHU4(^H}fZ}FvX|>Ta zAOu}d{zyv_yPRF<^zKG`TPt%j##GhJ($?O|gY`EGi;Y85M>MX>;l!eYk*1-iWcu8B zoo8mp`x^6;;^_9(V|1m&`A2ND(Xv)nu`=-X3vzMuHFFc_nCUxddK%y~h|oZ5l~6_C zuDM~2op-Rip0z;PX05H2g_)TNwi%2H=JP5dW{Lo+(Awdxot_y+EH1VfGHB3^^%RsL zb7GKIS1BP+CVOhHVDH0eb}u(& zxrfLFaACzjF3<3s`~ZoM+gbIV}=`gBiz3AZ_v zz$g}MBEOIrCBw$qHDm|X&{237B^~TT-J9S3@xzx9a)c?30W{9ZFZO%$fWlp?wpRM0 zfmVUHi4PrwDkvaAbrYe)If*f`$gg0(EIm0Msze>@P@C{B7|e$1hDF9^mr82Ni}GNu z$_Z7wwSR2y^prg3!OR)(fSQ6mwm&;~TM=}bW3v;3kmIV5$j6SIeLgK>&aMz>My*FHM+b8SAaLSiQm6NLO1!UCY!hG%5-RNeFSZ zu{1H#WCSKU-nm;_8%t8X)+(!mPkt`eCI-4|%~AKRhxIWvB@JD$Xbo%Vf#4&CVGvey z!fLf4m3IJIMn-6aGBHNHe51R6aCl@~Dqa8-%EJ6GL6D>YmyoYqgSz4})Nm&YArF7n z&)+v7v3;PmAR3?a0CW%r28M*;(I7d$vAeHLoQ<2r!M@(^8!b(3U40?FsB+)O8xt>A z)kfdw!IN5sZQ1$+8ITZMQ!I&Lrv+j9J+S5E894tH;@NC^w{ zc5^}p#?o!2TQ|PH!{vrYSi6L-vQiOvX-2pP+i%>k3cJS!rXJq9!S+yBI4`NbK2YFh zw9dlX)=0%!U0}PxNO!&222aCPs=6iTw~6AnHTw#*ydt*dwl(xbTBt*SYU!-Aa7!_? zwDWh?N4JNKvH4m(dpi&CPOo5FH1Z_D9TNkig;gWXE&_pj$<&UK6#RowS)e)etKXbX z-TRk5vyH=lYQoWy=+DktU^&9v@$0|;Qd%wVl>NJIC7o_HFDM3G`$4DPE?!p&Cl9dm zOO(fdOsA=NdVFi{=7mGaIYjh@QwlmQ9hW_;H1;e^!lfSW^tB{e^1oBm3kowb#^x0K znLNJCpY2cZXB+Y783ljNKsL$q_zFL;wnNSz<ahCGGEwFiR?6o~#eDlrcB$f`6 zSdvFO5Mx}n1LNbVMbL%1^s(|0#TTs z3(=C-m66Hfo&OFL(s&6NGf_YaNrqV!EBE&%OEHt$CMLzhqR1L=oK-o=iKqriN!pySIlIKw z%`>&Rd1$D*x~^`^mfqgsVQC8@9j)5E-L=^e0vKyau1F{JUg_!Xn3|S|ySD8bY=5P1 z`!b)FaO_tN>Imt21)r7{sBxE00CQ3l7eZIC-@y*#A*Df(!jGm)CCps`cA@EN$I~eF z6H*!LaZZ<}Mabf#t>d>>PR(Pkv=b?*oh+Jk`&hIWM)vhWmE&0voA$7u!7Az(2LxaR zl9+1k>f7GeR+$|ig^t-w5%TTH7-+!@+zc^Ao6w=5I$@D$K6$&2cSAwIRButFyJPJkC~KZLMQ~ zn~lkO1HE-1)fzoDMxd*KJ1gprFHuU9%1X%gETm+Q!D-+0!3; zkx|hp*cr%5heF3^H6D2|E{RK40<4&{ttcl*h{hE~MD2t8{Syb~Cbnd3LLrB5ASzM- ztB}~Nik8mS%FI~ol%c!Ob)%()lNWwCE&}63y{8)@_s%%&OZOEwTAP_}K!ugDDM01q z?iU)hIX)`X+dU#NH9ElA)g`QC`}ja-jZSt_a#m&}>fY_Fkr8|Zs;E$RA8+e`wbu5U z{*gZZwl12c&UzN!2Bt1XI_|D!KC4{)jRdP~EKQBf9ZdxhtF3&Leb%iqc6Knsajet> zgAJ8g4b{+ul9rmD7p6!2d^WDrU%%GY&@ax}SKw_ea5pp$(X>-pWxn3V)yy%aai}27 zJ*&72*P6PM+lq?KovLbQ`nt#RGEq~kqor+#TP8Le4XkY)Y}T(+kUX9|ba&IkgYXdx+Zg56H%z%Bg+Csd_o5L}!1_DdE_&w}2_( z>0UXfAWhPh$L5zg^++f6Kf$Rs;?%P&(ud5n(wWPT{JkX_T%8)Losb@8-e9f(RAL@f zyi)4b-1XY--TC<=Bb}X0m1*OJiVN_i4P42{-lH@W##m(V zmEc$^1u}ZJ@7jA9Lh0T2fBn{U`<+ZW`6?{TLvk>$J2Oj=buarmZG24M*T9 zA3vtx)xhqNr}E0j#$hF|?i7CUm{+QQf8*o@G;On7*OBvpO|J#-V_w8il4>Z-SFY1vv+rJ0hIg_d!-i6^%JRVpOK z8F=F}jE_TE6e7v)n;IMX#w*3OwM|U`-D8 zx%nFd#H$wclJ#sY%iO#vYI7>q=d;t2kYq?o!ofn^vHX6yG&9IZAI?iV_s2& ze(wri&A)K@Y0`@46|f4fE+R$$h*y8S`rK$+1MN0fGGcW)(jkV%l2)srR<{Z>K_%!v zwq!MYKL{&)c_M8q%Fl_j7qWN&X9YUek*PQ&A00!1orDA#zsCoaMfpJ>Hvv~QX%Si% z8^AzTSQu_I`o^{$41K0O04|b=iG_v9dLx{^aP{>^kzk0Ai;K69y9u87HQlmXySBB| z16gW9Lt77<4Tgq#x@(Nr8yV_VD%Xg!!;+Pb*MaCyTKf3 zb{BW=z;LWKM@J=R<0GfI1@65hun8KNsnHNC8A(m_h{i^+!ETrjh6JUJzVOV5BqPGx z#SPtt=$#4(Oem~tZLUa<3h=>Nvzv#zvz@)WkH0VDqmD&q#4lVhv~tGKY9q>M<-pot zYGGyP=n;t4`nXM@{$7C*Nr|DZUSaWRDN#Y*wmQZ(UQtngPIgw77Kl_l0#uhBPjFkiRY#M#2g z+G>OK-aT~%@gqGAqdTjbYeq&Z?ZV?NwS@vZyN%8%df@_(DE-x1b{cCn^ey!bvXUzr zEB0*b>1^8C);%!R(-|Wk?<*T=XxKM5vuk+F45j(TmbNw)R#x`wY_06fEnuda;lo7) z!(!vFpf6yem?t<89I?(YM%_V44x)ohonb)ii- zc7g5(60>SMVQ}?rPkC`#p{>|s4{&`%_N;L1^lgl+gr~c&CrL?Lp@TYY?BFu9jxK8} zIkV_KJ!zE|V%GC4B7?Fgn6>yOdsXw~*yXdQPhY-#Si!A}moGD~aW8Y1rI)!^Fof!7 zPZ&IN@Zj8BUtfN8OUt&)XK~waa8TN+-GcMKn2lwpq-AB_$hn*QR~}p66>z&Ouk5?@ z;nx^QAwPI%&n`uL9;;%AT=0ETfEK&iEnYs3LIn>}esv9UY~lBfkD5o8e{`=rG_6x8GtPz(p1x9*KAK_jEnx7Ok4%)E=(b#&NOcxQZip_=-yT_ytn* z%R=kDw-3Mk5b!_;VM#u$xkBZsmYXE6b|OI znF7@M-pst8flLGIWC@v&N4lTqJ8@Z;n2JI~AEH$`eqe{7GWwhAZKOU3RU z9-c|!qMH&eoaduZn;0cXEK(Q$58{KQS;Ug81S+t{A6~3#a&D1JP!*1Mim^Mkl^aL4 zsEVs*YPk-s7ys6RowAO#@OJk#Z|U!^j~(8Rn!LQCvZ>MdQxoX=>suN!pe2i*&eq17 z>iW)+-Ba}B!}NbQw337h>2`k+fq4ONC|g*9ctef>sYQslMM@(w&~F$KFVWck}zdeDeAUG*0j2SIeZR0_OU|u`tKW zHyVW@n@wgTX*VeL;>vou_SV&0oE}RTLO??}uCY|cf-5ND!2z(mLc(;yH^pU@Rr5|G zB8k#6TT*X)pnmtBz58e9=I7?*PUHN^%lrl7zsj9Pnn!$EYCPhIsMCl~kdkP_OJ12mC`^J1AFF5M^l`0)GrKUjHIJ^Qa3R`N6BCubz+R_obWLT9(Vjkf` zH5SKs)pSk`iK{Y@#Y~6-`a$X_5YJtjiiW z3GS{=F5Z4H8L=qs>4|kRXPJx8$&qzXwzoDnWlcC!GjmHMAw7d4qGF;#G468r-jp2f z9*`2{X|hU7L!cuta18c!v9Z7pTnWS=_l@@67RJ^l)^4^IX6CjgMjM@s&D|Ys5eu=l zGFxNgXlscz83#M_b>`Og4wi5>tzG;A?JRvfP}vxN?#NJe>x(a6IC<(~kH4FL(@e!? zag1wxx&@j&VhjvpY}UCZZPvx!fvRR^SKp4liCz2l@1C68K6>=@$;RlxQ~f9A_ny1- z%#l;49kHx#Z|`XBXzOfi>*VO@U~P;oJy&~MJ6juTn-k}s2E^0LtJDADRh%4%q~abb zfH=VevA4e+K%Dy}5PJ!TjdCEy9(xSL`_D*uAfAx}vGY32#($-787iqMV~58VXx24( z2t34*$f2Em@}^(nA$E_q5D!ntc?f-Wc@bvg0>48B9=@=B^zzWqK?M&5&tsMLRd$r2 zh1wD2(dSAEnGUX1Z_BpMUP;BinZrj$MlM~tcu{(Yo5p(*%r_?cX3m}5zabtj&Ht{z zYS;PEeXsuJ>#sh=Dj6R??8R3v-Q|+!1XFN@7!e9*x!G8NvJR>%SV2O{9wL(=2O+(O z?cdLWgUlQ|&%v5y=d5RE_V0&`+davvxF=v(gnUsNdRiGI5!qPtW!I5X8uC>Aj$Qi@ zMZEIvd+#1Uj{M&p$^e$;W7R9KFB=6@3nbZa<`JzRYI~r*pvq)Y4}U4>mFIg-!$-d@zN`Edu}0}s5!a^yA>5_!G7_Wf?>DI0PmV&QFBveSz<=H zLhJnxzxBmcYKu$Cvmtlj&c!FG7gnIp)hoJ)ie$KIO=$Az`lhmS>{Qn?yaBxL5EnTMrAvf1_V2p?GgMgB)OP~Gg2cyFi52$2$V>9TI+zmen(2q6q$b7DB`|<-DUrj= zpX0qvJ(N4r3=Rujh{5BuG8>^19vTu`)ZcaBKwpZ{8e=Of@WTm*PO#b)6o^%4pFr#r zuU6HzORVcfwNPcYA8z<+Z?H06gRN@~ZCyR&L9l2oP*T@5SZ``#j23)kM08f^BGhQO zW}OMz2QAFat?ca`pb@=%`~pMKRF8pRQaYY{X`K{85%O>eJ$tHz?$}5cv_|!0O#ZGH zUpzd}QkCxE;OOq<;p6Welu_MOksjvlg3+2YdavBv-8}sQ0(`wZ07LYMKq2Bw+QrF< zb+AXTy*YkiODk&|Yda^;AZ&Jq2YS0ZZ*=gFkMs&kcg6%wSzVx`V&NU^y3xWEALvRT zy4ZL^9=mR|a`5zarQN$wPq&BwTZbTTI|u(@KQB*z{ABp`P+#JY$5dZWA5UMO5Ll+c z)|SB$KKp-ve5UJzZ~lD!<8F)O!FR8o8)zNezkAn!NuisAx07;GtWCtuH$EK`MFrc7 zU%dL>Cm($H&HHbD{LvSG`oovszZiAkqn=-X`I`@}|K$(={BJhE)Zfp|-Nn~0(7`(d z2^d#PT-*%6I=Q=}y~EWjPXXfSMT#|2AJ)I>zT(3nq!3pEagPFsb+R#TKQ9n3yd=Yd zHPqh4E8n3I;Cnt40>mgrkv z0`dsVMfN-oZ`Yknue48Ndw+LVb7M&fu3}kLUK*SK^vkb*`_Wq$UpPDkW!T-0B@8}{ zPdA0|$R)!Hm?OqxFf?iQCa$ifrE2(@yf6d~DWXU?l&eB^hUH<%91t924{-C`oF#y` zZ<^F0xta&?@dlJZvnl0F0f*|qA#`3|9-Du=;K3tpSfo~fW({ES4niHv0mia@i0db2 zKmb0-xxp{4DP>mmA=D9%)2(-*{gzOlH8HU?t5UpkC_i7`*}ByvSRWB_<1`b}+ zXFT<|0_8`FkK!M@BT4bCpx)fk=TDL1D|k}ztqrXXv)dGcWth;2==fypgXZT;B-^(y z4(O6U*VntPy{WOF9Hkxi04iZ^4O1tqsV3zKBT{lxBJAS2nWfe~0^s1B9Dwr^1VG{F!?BoQm>`4M$))rV)yiPe}4-${&)QAk=Xks?PL!bkd9kgT128>%E!?Lb zKDOh9UmZH!DoS81vblEo#ntfdJGM0zrfr7U!}AFekg-wG3gF>A2L1ZsR%kZMD66R{ zFU-w@?jwN)0nHO{FCN{AcDp>7^IbUrd$aH`vf~3n&aV16Gv2vL=jf3z(5(? zQ8nKT3pbWzAo-xuL>-=Q#5mp?W#a_s8DTf;VuLwq6AwMi^uptvi+T^twue}(HMVnf za(43$z(H#C2~&BnZ$OZ{iQXEQ^t#R_Nkx8w^D0&luVZSAG^94JjcIFZYO3LvR?(!B zV`iqt#v4$tudiR>Si#}r%mWAPb^rpzDoW5s{P4)Hlx8?X)tT)>jxXCv-qe_w%;^u^odnb2qFE>kmJ6!0qFDh;O83?jZX29WV4)y!-RwK`k{gB|bN=K+!IRmja7v7%E+*S(X)V zygL8+S6_Yh-W$05GKsXKTm{m$7!^U%Vhi;)I&bDzc5-2fqIR{uaZ5`ZKgb)Pc1eJb z=bpk21^AGt#Os_nuyl|E`Yh*&eCQJ5!H4-PxuOI<9Pz+TT51wrXfl-fKnKDUMf!x- zf%O>Xb?+G6e-zCk@4ok|%cC#eg62~aRTfH%34A#mxtaMY(0hAJ$aYlUjay`tD!Bp0 zr-E4sJkdfS9(1vHb{l~b#Wq^mG$JJl>4=mpiEd>-fa!@yNv||lDLyIV0R-OzjOdsW zrc|Y@vbCu}y|@sV!+en`UVN52j6Ny3*em=6_HYtr|1Y37|NMogKu;yKI@)fNEMygG zj3Z+<$7dJT)HOBS#er)`_3Hbek0EbkRiUt@v!)^=o8I5VXsueoyC2WUdADmN?~<## zh82QuaO!8g`w2fS6+J=+6eMGT8pEs22}NZnBhI)lQLVz{P9k9&En|{18@9D~?kO%j zeB!y|$B-);dFiDK7tU5R)K@_xHZbkaFTSd^+mZ0~|C?yLa#IZN&ZGK7Vw27e;=AL$Em+zH)mlUmwDU zROGb7?j>%D!ymWHE385{V_RDT54%K|oH-du(HQym5SNTXh9B_Y+dd}d$IHi4A!^74bJ8;V0?eu#j0`2__yTG|GRBuzDCMOiT$HCchPaLooY zv-SEo^{l0(p`oUN+GA}4Ba9Et%uG!;tXm78(-J#lHuesVPOLNM$T=IkV&se({lJiL z+~|YPgxj@9r_d?WB;N3h=TPy*#tKlQ2UrH`Ni z?an;?{QTCA*G|qIdF#}%ZPh6a8IFNQdZrB@eER2q{^Q?&JhS`EYoGk(vrn#Ee(%#S zfBo6W)eC1k*G#>7`jvC%u72~okFWghgWrDm!HF}kefI9a*h~M<*B^g5lHeDY*K_{) zu4i68ef-?7o&vk`N1ue<-G=*s9fkh^yD>}vHJedDfcf6`x(f^(&;882^nh^mjDmIt z_De@~cH?qXd)r2l{h4LfF|a(BYqPkk!e?f`!$q#^Jkb{L=8vMoJgxvWCA}Jby&c;c>T(M* z7jo%P1%(B%6pY+=9y)WCE3?xw8Ib@ZG%nL710BY@j-Gnui?6=;=2s z8d^>{58Kfwuv&tYTLRvdb4lVAsZH_{FZVj1&sP#5v;v%??1L5E%6TY~;ZuRpVcA~n zW<$u~Qvh4@Hex8sW#ec?pH*sU!@4-PlS6GXlftF3=>pNBSXGgxkR zpM3K1$G`dL_#x>Ly~%@3$M)e5k0!Tu19S7T!|W06uyWnR$e8lE@xsD|k&hqgx!$hU zrW#3o59)v=Vo_mbLtEd|@OF>Cj7CE{Zb=}e8h>8PEyAp1IZ9qKkB+206h64WaBm4* z!^um24_m;m2mBmt4^S~Iz?uNn`K!<_8}6zZ+`0bGKYVogESSGsO#8JlBbVZTjggr!0gsrPP)z__6l9ZbM10lY?0#{$ql*uun-A+Jz!cgDzNM$9 zZ*UmI$>zdJ3HD=BBkizAux`~lD|@RoT575qn(BZXF4E|%S!Zf#$yn$EZx*l$$wh>X z2-L7{oclTtIBj5C05UVEhC{3uO9OOeQ;Ls62_FX=BkyTe#W@sTgEn55k4_dS?(*mEKvFCYOSWFJf zX@Lv1Ptc+ov}iatg^;6cT5y_Zu{$=;9zFH?mtTGU{+lm8e_;2p zd<#rI9iyr}EP+w|FBj`d!ibMJ${oS2ttedO1CA?@!KXxKW@qOhiUbF^1B(Y24si#q z5Aejm?hQ{2a*EnP3_j#YEv>j?1Y*cy&G@Vch4N`UMzW}9U~J~t=~v!@4(|H=w%p{C zl*nN0gBVnK_*4D@uYiCHO6JqN>ss!8ertKWl*K_0)m*GvW+PO8H=9NA95hhr9-KuM z#;4xMypDcGmBO){oEi8hd3yB9ukNf77Z!+e$@=7l&;hPYA%u#a0*e<27O&L)5*DWc zi>aT%!Vs`DsZK6y*&rUDha zSE3@Js^bwVMir>oDLf)a1thv8unL>XjSbB;jXv;MVqiPwG_)6QZO@MysH-R{C@O0U zd~V0yy;rYZxN!CA=*hEZKKqns#YZmy7TlyxEJ|GDu;?0?J3z2deQ7vy&uga;l<8xK zmqtF3iy`Ddx;qf5t!W(|+g)3cm0Mcf+_~fXC&ZAdJbBODTjYU(5)YsPd(f2gxQ`Ad zmirecg$iI~O422WCyr?G@ZJKJ$#@l{a^pJEj#A9FIBY%3(CI|8tp~{ID`OS*=Q5XQUsIvZd;LWIfPIivxJ@*Xx?M z)D>moPa!2ECqE}0*G3}al5ye))e(r0<1Nk#El61i@Dpl zJwE~kZGQ8hFyroh|K|^0Ixw`ghOTPzDhNteVg3OV!g7!TUzIo(QB=eh+ED*vPGMQVyVqv5XEd_ zBbf+cScoiiV{mj%U3cr&t)0ES9XmP-J$1DS7l zhQ((JeRz5?-fBKxz=WGC<05o*leuni^YZl%Nhqo;El7w8k4h@dk6*8*q^+y2xmw3H zG{g;zz)3a(OuPOUMqD0~DJDkW)qTwe;pK{gXTX7&><#vm|u^mTW(w;&Ub@ey1! ziWY(vQhAtyCz5=4)ZW!Uy!X(Fi*LO1?%O9%&d*DEDM9vFt%N2>kQiL=h>QxfuWWve2Q}Si;i^Xb1v`>?t2T{hS0)@|>1|lv$Lc}u^eCPE94T8dasc<>L7$}JJPFE1&8gY(^pX=;-;gr%oR^ip#=d zW81SOt*upQTi&dzW9toOMoO`ob@Vf!LC%JgBqRUK#)N^kTV7z+`0D8 zKYjeh3o|3&!JurXY(P!}5)QmC2H}94$~d=Gh*nzcSRfyXn_D%-*(oSH&d4py%OKsb z8Be##@$%3^P$({OAP8SoiJ2y7K=0Jcx`Al0n?^vSm685a(BPxbpBMqL&^M_5{Ur^s zZ?;T>RosK0{`UFn&rWnSh|9{@a{h=wg{)i(SB%3q6*OTG1+<6)c}3-=B4-^|V59^R ztg;Hrf*Tg6FvCCrDW)n?5CA(XiA<6T#as}3(7>rJqQIs|qwwJHjK-;>dm5uK(|2`s z_w*rw1Z5hsIy^EuE;+jdn*w>6nQ5^eCd#Z}qt*r|9}k+a>{6B36uNq-kxr`W3UI1R-6SE*Uadh>9a6iYp{A1K6U>m3aH@k zF$!e-Bn5Iojsk^TXeJcwe*y)AFPwXff*o=c)By!EJPOEMA{4w_AxFWHrkk*rz6A;} zzZ*LxM?n`})=xn}1yIm*VHpJ{WRL769t8(@6x_(ZhXH{$W^8z*NzTOJ5^6yvR}09K zA%jV`3FK-)0JT7sc*3F#X}W4!77p82FV5%TAr@Jbz)*2&@UBf#8g$^36;66G`Cz3yMCd5I4J{qj>TT(l*)qDQ(uikylZPRco=>MDxZVYVW`3NAIQQ`)>hX{-RhsasgU<*4MZ1jdpm9{osc){RVQ2Hn^~ z|7;GIXDELx6IVC%ip%ry{+|U~oGDp+4#9YY!ugP#f(P1=^7#0Y5^w=Q4uqowgxBkq zHN%rYIQ%mpr~?QVCdRONeO1DfoLv&Wk*sPI!=aF%`PC~TDqkwO4?eJBVHJ4rBPF3v zAEX12%KPhAcuH{<+aB>?M8Sg{!sBzd=9lIo_e=!)2Sk<~ogb*K9=&kt1v(EiKaY)} z9kY8696EC7z=17WUVFWvVR&-?VOlcYGcmJ&cFSkWzS2jhcpmJE+`r6&)`8h&t?=55 zech@9JISz-1A(8NP$fu5OG9;S^YGX{5lpjUNmIx6WgsXC&@IkzG#^pC*|YZ;P=S3+ z1-f&5hx-9~fn@~zg)L@Lne@fteHoP`-4j4HEPG7Kpab;6ou6)9Tf8p3e(er|;R-%* zxAhPcxO?aB-CIBW{i}D*9T-DO;2~V4@a58Vg;r?B#a%2(w1Db8s>~ z8~(rJL7RPe^V{FOdv<@{)|$!%o(O_6DO@E1niy4)k;7pywqO-`Nyz3GCg5tjkX2bN zP%-vO5M?HzFoVCfNbzuC66l~!5i`mOKpJ3xt4j~*^sjj2B1W*ATp~k5VzMNY^CNlQ zHa1Sq#0a`?zlm?XP0YwEtw4@Kl$x5j$=lwD)ppW1arX6cFkfq609!^b706IR?2HB^ z&Td|Q9&04|jV?d=95ITj`hrygZxOhh6G4T3Nkz<>ieA*Kl6`TKc? zXO`zDBo;Px_Oy3(w$!Euct#gyhugB2I<^k30a1wwQGPzb&>U=(Qe*`ET%r1;7kp9l z=S6msGp6^fjnEnv*LqSfxV`1%V4|n47hEHW(G&#I-UVu)*IFvt=863$4c1$ zXFgE4?EV(P1sRkAkB7ePohO+w!JLdAJ)CC|E>rEwIX!l1&m*aTBlaW}h!4{TNGjZi zRN$Uf7AL+u$8>W$q}@!9tXnDfQvYL2Y#KYmV`8dTfeGB}MqFaK8E>QvnApN&LOLyY zmM9^&m3T_b9ry{(5TrsK*S^@nb!m2XY-y@2my3lZyhpOxDySpPNRy^&Wn`nFIh$7t z@Y~Z<6XG8rNl9xi8A?gn$xPw`RE#v`VTvG2maQx)&MB6qE~Q!TxHS9RCtrN|+51<{ zKQ}))#J8H)SM$veeD(}qb`0bL7h_CU1LXpO#_(_b>dKX~$Iice`O4exeZ>Ao=Y#it zb>)={7mr=M_}10=c^2A13QVv^NIzH{TtSMVo!fi6`0)fbYK!vt89Z4{7Kp>pbOPBk zelMvB=Y_ZLq7nSnciw$-*VUI~yimXvQhgf@9r_SIL*v6D#j__$FjwDI04h9yPFO;( zIj&YIXT@e@$aZ7iFoAm%{Gmn)kV(ay7?t78y_MLG5#`{W?p?@)zha0FOdv^(&-LKL z;Z-BUD1+*5*;+0xgeP1{vjZ8vY0?avzfvwo$H5ao#~UlrapbXFKGx z`}PeD^>hyn?b$Orx_f^1z*xmHHGcEasl!W0bY}?~`zbIn4ruVx2-V?3MZG=!sjoavrwSE;KS_C-dU97~O|vM!99_gae|+RI$rNRIi;Lg@dtZ3(t`vc>Woj_c5;A<_ zPYk1Nj(dP?HOFGvhPRs_E2x3*f$aVRumiJqzVBSFEM(X2LR~P|7x{x7f*ZG&`N7?i z-ChlL+=1RMPB%OFGmW%5L1!BAMP3fqh@?eLLmk$+DhoyFsVV8% z`JhKq6pSXKM;5J zvW0S{f-AEsDVEP55V0&O%?`qK2sI5=Wr4O+RAx2~b&z?3)UJ z!pYOa$;NcuS_5rubvR6#y1)jgVdvn?x~RB&L08B;4e)%Afww27>%JI5_@OWfjVD|n z7bFW-;qk$Sv0+T8G=vT2LbzZT5X0BUD{ymON_bdYUNu|^SPPYK^NJF@tt~AP?RF1} zO-_yr@(+uO<*#r>LzMVL0_t?=5q6f71JYx-?~6J=Ed5eZ1^#QTF(&`e5^90k3@%6c^v+W} zF-XL=c6U-=HcyOwD~Q2~g|jc?08a&v3_&;Y@Z-Xfowx7~&5MheO=D+yYV1deI4>^x zK#j+T=698V8ZFDzII>I)vYC{w&K!VMlC6$Y1!(C{6Dbwu<6;6~(GlfYaCTRiaSi)^sCQX={B@?Mt7w43q zfNCM#a_5l?&wcjg7azZK8GQ_6G~Py&I4bK<$AAzQzTjjSRWLEeakS1ueGH^C8sB>6 z?5n?d|Lr%gyngxBi?WxsU%mYLm0y4Q>(@^`d*A?zH$8#}{O+H@V`PYC+hjdK$k1q; zR0acha4}{Iox!&;)HZBs>+BnvI`}+B+wWezGWw#7mlR6bHLb*s-fZl&-W1{DMV4^9 z7`L8A@>sekpZNf{pK$+BBP%vN9TP#!0KtmR)@>D~d3i|x=ONZ9eU5vMdlvha;006g z4%qSc;#Eb3v|^i@l==TMb{=q19oYAu!q8ES(P-?wD~f;=ktTf#z4u-O>C&dW_x|U;H;9`3?fyTzCI+#?eBZhE+;gIHa`XF8 zG{?bEWuBYEH_as_BqcB@NFT*g!4xO+DBX#T5%6*NF+PrwUm41S$HyVwuiW%!eE2R$ zFRIdC5kt~_iEDUU2E(Ux|C*u4)?yf0tWqPCJ_ukA^lk-2T2b#OZU%}w>ZOMY78oGH zx{2I%Zf2g38|ZnEP!Gn5?c!5BNUZnNde@bfov zV1+=PV$lnY0!(&SS0An!g2|Z%%`q!CVhO)w8e&OfT=9l2#%1KOe@21eua@k}1zRht z1Mk3I=oQ?J2R1l z>l63$Fkx|^BftbVIEWnYd8jp@gkGOfr_sSjwxS`bOV@4D)7|m=Hy^)#YG2KEU<6^~ zzzAFHP*ljD=Bz;)9=%WkBQPoBge^5SDF%Leeh4aH#8*kqA|KD?PS7B3R_-eUBJlBm zk_wu{GRf8{$wZMId-g$t?5R6=1dja?hxYBPuG$TXyz}8_U;p#_`wv?g^n7&o{SSJK zU^P8$KYjhqxxHK0p}H1NDm*yEiAntw1D|Y7PcHlx5+k*!_;~*rsLL|9!X|sPb4V0+ z2{0n_3kl>21+sE7{fa;lI#cERM+RU;5A^|GFuy2(`0(=ZhbhX@&Own~ydlJ427(P1 z+M@DlB_-TP$3(|w>#aE>YaCPzU@n-|4;Wt5kGfy{X z7=htKo;eL6saQFBF=?*o+XLWb*bE$i9`1as_j(P+8SHr@4aStsiaNM;S(e#JZ0!Fw}ZXGNnn@tKM zwr+h@-ME{y2Tzj1CrE<8?m_K=cF;4WX@O^2&Ym5(Z2I!)=B%vr^qlNYOoV=>F%?L1 zi6_av!7x3&{FF*qSeV~BRFjvRm>7mvJ`J2s44HevjPR_H zc#x4>hbV)Uyxa&54hoH3iMge3r=Lg(iYUT7{PfVT-N2b-cN$`F!~vnKT%*t_2UH@J z7VQrD2;;2yh(uLTkS2I?$bp&@CqDU%pHv;Kt-`*WzXnaB@Hskv@go7ku3U^JF@z)F zN+bUI^_Lqizy0a$jfHWk1;rKWo&5F!{->JCl69%^!TEbXxqao-8*ea2^+)v$J>bZs zqr3*G+gG~_`3SVZpkWo?UWoe_*nkZb;WY>XETPR2LRWzBmGT`2Ph7nE=G(V#tk2a& z4B!tz5}L7^V(5xPk?7M7fhJa?R7qMH5ge=~xuM4Oh9EaoIPE0Ck!q2Wx2`ZbAu2K~ zJR$P)xPa!4S^@sJ?_!Z@=oR?9Pe@$jm0aX{aVa|qpEj>J?R7i z|4L8yF#4&n;P?$VF;7oTO;5{7N{^Kz&0iAm%a8pXZG@9EM|hmnZFmMJ9trCWeejQQ z(o!it&EsTLOk|EvahN=oYL zb{rkT$-(`9!ilbdJ0{!N6jfTV$+!gHA3p$t4aZ|`BA9`**HzZWDnrAflCstmmOp%~ zO?0d&aDpr!UYdw{bdNX)6B!*hYBVfl2^QY82Pc^Hb4IXC=^<7$017-+nt>;QLb(S| z0;LaI4?&v{P|$19-pQYP>Ohp?q)d8xx>|qu{1!TOt1EQdwB=Hw3cF>Qu=-fH7V`*D zB?*Hnd>p1{XC@~k#A0HpqV}(tsE`2n)C5x`HapU5(wm6;X+aafskRT?@VH z4-=@ex6VKnwtnOhqDuAd`j$7|{rGcG<=2O8yq)X+q6&hK*aw*BjbOEXUBCV7?rRO| z&3PakR0+X^P15sUreP5tpFnvB*z1MixjoDYeF|c8Gb5?VO#iqT#JIx-<%?t;jISgJ z?_lK^Z0Y^Q*csC1BM^59{#>Bh5LCifxS&nl$;l@wD`w@QDU;_rdwOFA7NA0iZfbIB zc2+XZe-z%!otD|6s$_``UcqN$p)hCqr139|u(mWdHZdirOq-4a6u^eJM!|kNpIN{y z90jc48U?aMm}MaXl}1ncr5yGXFk(4&^KwOrJv(ep_HKdhb~f`DIJo<$Vp4Mo)@|Gr zyL<-1QK!sYxYX5G6(o0G;T@>tV_C^!EAjfrtHSS7*6H`;xgugr; zMvYNOWEiDb9XVMf!^TD|d){j1^zp+;l8C{>|1YF;X8)4&6~FZ+qzFD*Y2l82Pa@?E zkfMc0RGM764onekW+P-I6Z|%ptB?8qZp%~N%>Vw7W zq)1_+kShaGK68*!$Z*>hn1is|)Or4=BWY(pannBmtqw zXVQZ=S|qh=;2WZ>Pvh+Ph$NJFYeFW4UaC29>C?~dy+?zsoix}o*ly|G5xRtdEFml0 zIFy6o(kTqe04kGkZ6B9FOCL-KeM9Fd_*Add6k(_p9c9oZ2CCo> zVMv#NDyL{ge&QLbm@m)t<9Dq{2pc@{0#XiaeiA8KH`Dlah6dUpqST0+d7@bCs>>`mTfeuo>g0g~ zOfgp`QMVk^m(40HDk@gD2(4OW{72>1^23J@9t2JrhH$bMI2rb|IytWAd9pupYwjA8 zLZPkksSOF4oUGzkt84M<_+B3zbG9_sUmawVApixrv*`Nw?7lv!@eU6(sKEOzvdi&Z+$ zon|i&4GmWK`YFQVkRFkdksL{%4emHmTw=D^CM871er2+A`xZI zym|V$G7yKpGM`&GnLi{U(=wLlSZ9D-7=%H`*zhh~hh@t;mx&zNW!|{cTw-g#+}q7= z;hfoM=yUN7icK%rv^mac3V<>V0XnWIix2Sd@I$C1M*0fs2wvgrU^8dx__3p(f6jXN zFu=r;wGf+Iu;!fE^A=XatSrni0hAd_WiJG;2^lStN&pn2kycYDzhH(-Q^4ha0Oex2 zpi!9Y-V*K@d&0W0zW&IOg9ncuJ$bUe{=$Wl63tVf=`0vnjg$L}s4yq(l1>Rtgf z+$++6b(B0`Uf!qZQHuAa>B3}z!Adwv zSd|XNa$3P}q>5ysjC10{lhKko5IXVviOcVN_SwgnP}#o5r< zl^A%bLatwb>8($1q^@6Iwdc@L%Go@5>J)o=;LPyTr%s)0YB;!KQ&?uz2iGoM>}?o0 zhCmlcm5C%(=$wOY77YV0{*xEGPX1sKU}0BIG$<9pnTvVXrY-!u>y5W=-&%9Mv9S+? zl?102LYPEt4i4r*M7wbcQ-lr26VikxQj(P9RNal z;xb3K^{ZD`S2KBtgvsLyhT|1)g{K^CIFSf|4UUZ;1(RfWY&d^J zPAxfHUQ}G%Rwsgr!6d9?Ea~d9ZQGzkumRZBd`2*5efUAsHqEi&8Ha^Q*e-snat8Z( zS$z!>xmTI4-}1yP%phI{&AXZF)a8M=A%b~#_2#XukHrfE)=0n_mKuxtbiJq{BG5p& zbWmU^sg^#3ZL>UNv>Hs!1~mEs9cEw>95d>BwX{*e7rOc&&WKPMYux(q!Gk~kc%Va2 z&F^i!Z375^(RAv%#z3$1_Vsl?{QlEh=O`SWvJtidFI$;%ClW4(TMvG%lD{eokbw~; zJTfsoJrRHB@V4OBj|=$7U|$zUS0B8#p&(=B3K!N%2| z&Ylg$GIrD$xV6kot)3q{34ED33khPgX3d<%&NP}0&4OZv7clEZw2K3(hRCOjCM96O ze#s(Sdl=yx?Ce;3&c540w2XD&>^VCZd-xRH>=)tWecpT^12PM2 zojrX0ece3+fc_8|H?iJw!VqlM3dB#Q(BMVE5u_0?!)?f*t zWrWe>2_t3rs!VEP`roz6#d4Nkp)lE^lD-)6ks_uPJMv8!8<%rM((3alz2wpI2*<~y zVF)b}jK#D(S+a1+u=R|AEXL|r0sgw`~g=reK)q%%kDJea(>RGbXV&}UF zRX<^HOa;hzvgCH*h5jdn3|MtHkY#t7fhl3e3BD10DrJo9IGh@=z6?KJ?g^bgR%zqpC~Og`3EO zRaDr)V?`UPftghtL}1B{4^IgWfxmTf_~~nx-~H^<58t}d(y*7NVC(t5I!wW65$}&4 z60A8`uhE|T94sj8#Fh77KYwx8K7lKsivCPrGkeDT^r;ia4(-`~;oAFGM8|p?^a56Z zmPrjqffnAfH8=#LJv`qp#A_CkEJPMM`k)Cm_VAfG*uxiYKOUY}}LGpbO~_ z7AJ1jMo@Dd7euia7I_;ARwcwmfFMz^yhNdE^*APmi+efY{RA%FJdR%n1%}4u3Ag4s zn2}{jakGpK%kSx0ysnRcFiC(gQ3R<1{QM&4;}u_*{_l(zS7k(phDN6*V=Qd%n<$LG z2quw2#;5qWfhK!EljDOc6!;BzsdDNWnwT!n@K2^WS~?0(ap|6(lM#jqqdYV%MUlU5 zU4DMmRi*;Bd?&a@{V}86Sy}6MBWx^pRBnEDPJZsOV~tf=St_?>1)(l3k@vpp>3D<} zAyI>d7_zJCS%$={A(uG9_Ml#l3k+!*WJuMK@|NVBlEY<%MTKp3Oqr;N#XjW)EDOsZ zq_-UhL8>1U(&OY3*~&pv!*0MtM`Pv>w9y1q6S4e{m1|~=rAZQ6{7(3AB1C=#KxFLM+N~L%YBq=u&FA*o3Fxl zv|8>H9G?^yjxv&1M7=O6Gcm@@U0=SFQW|$7^7_aTJjfo}yF(awy?6JEXTdSL3p@G$ z8ywmJ_>;eW_oc&C#W7-^1$eJq;bb#+&H};*=wXk22afG#OhT5+#PQEtqe*lWLYZgaz8rxl z>~wC14F55g4g$wuPe^&8SnbmV01`drzV1#-7tO=cUb+C{g|XAyG4>4DA*J<-*51j^ z(cRU4;Vc@S;i|)Jr79sW#{R`IIHI35&&I*k!_&jn9g(YuBY?HeVadXIv!_oS%ZIC( zu*S1YOiiiE$ZFWI;nu?uGddh3F+nA|%+hL%GA|H`Zxr}uWNkEY+;hgzD+syXyfv%y(o<+<5FQ&=fG5IC zll-&wjnrWBRSxZ69_6w8{)JtwE98!gFM8|Lrt8<{=i<=1e77FcGSLyH1*w*M@GRLV zd-;{*=nw@^GbCbwntY(<5X`}Pn7;;2bkg6g02oF36M)%sik2=DcWe~^Q(o{iU_t;G zbv?gx5!W5i@S2)hK$(ojQG53%uxB*k;!Exk}Kw}z%+`y0<+x%t*x zucWO{RjKGAoJk#lB}Y>B##LEJK;aMn5)!s1bR`&6$;RF)3w8DOiqet|>oYRr(*7+d zlH?>m1d4?zy?ulDP^Pp$(g)I+G|P;*5KL(05sAqQY?J?%@nRxPym0@tbVV4gQ~1Fb zU1mny{Z#)q_V40L2LyStV-P5&*va!iK`E;ERM6A!d2zf8#a{`Z!1c!?v?xzU z-$j@2JnHD}?ClUA*{?a;Rc~Ha>+-ZHF^(31!d7vWCe@96q;#{mC3;;m#uOrb_RT~UYfL#Q(9wsEe3tTE>mo@C}x0ltxZz?ss^5lfgk^WbP)%q-z-8C!O# z*bYqTv4=Up&3VbZ8MEfYmh8L&IeVd5vCCc@3Fp|fS@V}TIJvkuy103IdATF|dC}Y% zQ?WWhMV_U(iHtQek(u!6WtLj2vHT(hUSDGqtI?w;C~^ab107e~jWKYE34EABq`@wtZv@Q&5Vmg1Z_G! z!hlAYV&1jC(4dH&NZQGq2p3@q7ykXX_WwL&SC z(waPlyw9)OUj#8LPH$j>jPYu!#AsA2e*|?RQS49C5lWOGi3)oZ6s#RgV{nsa0_$TC zGI2t5p*m#$Yr~D;E2cS^fhJ*~$wbiP&c~mA{O+}jCl2ly^nE4AM@RAYnNv*%%B5%Cc=Hm|z~Iu5ImR|JLlZDE4hg&Z zL7BqeZTR8R5G29HD*2JaqvMk(xOx4i61p{fMNSDz$-!j!*zTCJ6j}qH(f5>c`#>)~AgkQv?>=Z`B%#@gLsm{%&<~&&Nh8 zfe&XdCCCD;PX{JW%dNZ=QAtS#d?X~&G2rw;exQeE?+`!K)wNi{3;ekM5Qswqcjo}U z{4ab=A{Tc3akzop#X~RrR z%*qfxPHYGO8QJaV}Fl2(o&en`Yd7FI8e8HsomBfRhb5F%$QNr?QCBMrg& zQm6P{E(wmI^J+iiunp;(HmzD^R(tX2(F+%9Ybz`N&9CQ4acJ}Vi@0slEyX8KG8fsG z5od%9W3}$(F?cbrd^s;SysRueJv%!teKQK6^6*z0%?4S*-hso803UZ32fK9x&>-sv z7bzuW^@aF+Z-5DmG>GocP+g^O?Y zzFI+v)E*k7N8b(IO{1Cug~Ctk-;ECuJ)SMn8kk@+@Iyu8Plcib$0HIYlt-9}pIilg z1O;h>+pu!jpQ?*Ak)sBgp1bs6x^NcRSxCrJRndi>@N=q4^?>j2J;JwAF%zfOic@h z;ZvznBqS~f)Tckl=teh4Rz_MHt^;iy(EXv!&XOxV+HJR-B|JmbY&>b&GY#0Ztx1ViHQGH>a z`i5GqYiZYu@Xtyd}7GX(5 zLCIr4Y&gQF_`hlZgvpkDHPxl{rKLaC$&NwzY}vw=7}FrCuBMr}$KI8E%+n!DS$FUd zuQli<{RGkB#PPLxT#o7L&CiUjD6_bXOu(x$GYYnC^}*sJB0fETW7!}a#3JYnDV$jv z258XZv=Dda{i4S@gW=(T!*##`58T*-^pnsKn89j#VcKG_n%D6g5TXR{+QJ5eY1cw+ zbRpwv;4vq#Tkm|1R~wJoe);FeZ=61Ws!>E-vE|%0GekL}z>Q{DZ1Gs(V4WtZsc{iu zs3M9IPlEYXB9lCvw*iyZ z*n`S8u!5~0bp%>Nt$vCXZSBZZ(csJfLIuZ8X7m_h;fC_|#bdP8iX&930Sj8w*G%4NZjWkAdqJ_+8tb-CqFseW@W{KbfMk0TpRF2R4N1%ogjeaoE zk|Hiq&f-Nt9w75}Tef7uJaz#Jq-P^GfBqtemGIo*H%vJ$NzqETC9@|_oQN0_Tz->K zuwiV+E=E}k^v0B_6JLDcdD>3QFc4!ZJ7qS`O6D#=fSV`bWAA!e%aPBkq-=jF$&DwlapOsBc*q58n8+!d+S7oI zLD3;#gP+~G-)0WungG1xT+f>Lob&EW*lRJAt-R+4rnNqZ7O|`RCOo~ zZOtZu@E}2FV9(wL57dEln4T1Jfg1y1OgK%kaNS7Ih?HgXYZ6W9%sqQAUHa&gPd<3_ zO7qb@mHfFPAErn%EF6Of$neC8kmYMlZ@$@bzV`63;~<9qbU%pE-=aIqwV0f4+Pm?! z4^ObuGA%PPOsR@Wg05Jq{1vi7o55g7@jQ_sH7-b=vkC@wpO8p?6HX!VBglzK52UmU z!4qGG0U0kDkg@(hBBMn~&sChg1>7j)wO?Y7J7Ku1;kC2$TbZ`K`N$FcZq%QD&V1IU z*L`L{2DF9Qb@k@WjXO5R?!DfD7?17_@zL6Wquqc;Rr1r&7#WsV^0@hI-C-UYuZf%a zF_p=d+CgY=WlXUM%-~9;R`KpeqFQSR@y4uhhQ5Hxf$Ej+uL0nh?pH~@g_llJ2+51=Iw zZv|8kG6)y?AzbLe7zXdn^fJgc;krd=`lJ(f1`Bg7jt{%}LlIh@<9H8G@qgf3HQm-2 zP(5n@4KKVG>T7GN;C5!WaTRlL!VhR*?@>zng7zMKTtY@dG+pgRC8VVzH9jFB4(H)e z7~yg+CqM(goiKuitFyDKhgCpiN>)Y^?D&*#4}~!&1zV3Cno!jl6h=KhjENe&&G-F# zwDq|E02he=l^P7<5{3B`OVrTywg39f-D~HL?%uW;Y0BwOLL)L9wvsu)P!|e}pYf2l z(srCoY;1a+3#nm0d(yb^lV{Avk;Zg75`j>_^4yjtMU$tZ zLF~n`<0efRA_rdvL$f9X1-rU=diyI>!4YvOnYpVs6he&V2D{kIn}@ZAEwY65HUc+{ zkgVl^<+<1%TMT zlDeQz{s%njcdUZwxSzwF?1$nI2P!n)$nC(P=g5dP`T6DL85#8#8ye1^uidj{%l7RL zu;>sKcNcMc^ex6`nws|QLyGRpvYNfePS)14HRh|~Imt;@sUivsnNloN@-6f73)ZgP zked+~8=?wm^EZKs*&Ve44mx|C9lKOS;-i)*vS!ofB2Z*=twt@{qaD;94L2Cl9${RB zCdVu{2S0cwOoL^Q`0k*9m`!09GGPZP5PS}l@(N@KCB8t(k(z#-pNMyyA(Hf8 z(_-1KyJ=FhRzbt6z(+V8(JLhK)I&@N8j*v8Fs@=$?XdlFK^Ry;TLj8L63nZxSm#sK z#kJUoh(i=?kT^J`Ka>f>P6QiwNpL_I6CukYFBdGrc3Upo+VSxx_wL+$<<#Nb6{STR z*W@EpA|VEmR`@XHBdNV`D(i9X?CW>ZN~#WkBtVId7a#pC181$yww!J#^?T>ti;#Ww z^~_NY0z`xn*3$xnJY4u(&*M2o$s>N)`sr6rpwKnL2#dPMaI#ohRd?*%sepwtD6 zyJ5Sard`Y4oyd*JHW@cvQZQbpe0^=`#m^g?RDd7cU zC`b<@#GMQb5HJjQ(Eu;FXV+^O4oeV13zj6LL-cqbgl6&o=G|M5I36t`q=$*xb#0yS z`Eu=qnSnMAU*mYR40Kx|I;-p9&;Ph{`NaNR)!X$I-1b>0ZK&M79m=VUb|08r72>Z8 zbF0KCfh(zLct$`UB^%4dJs%z7?~am24>=6XILz<{S5|mCs^YWqvXXF{1Tg}yFWK!V zOMY;h4mDDbkMDzfcL`j<FRM~8Nc=g*pk63Ox7#*tQFXV@UOedhG32)LRuefE4CEZ`{&1+_u$ z9zKe2R7T*UdG*?)K*xm;H}eXed|X?&HRAkgvom<8DJUo|#w2~s zM3Nhu;p9*qsXu<=`0=Ku>gvkMl9CKG+Xn|L6s`Y}FuR^0%$kEBOoO&b$M-v1G`tBf z1yT%D;W5!YF-Fl*0duxK!i4Kbg>fW4Dtw;B%UW8G4B^Gw#V5PIhOAuT9p|3K3qQ;1 z<`3H?ip;}Is0r{AOdmpQP&-nlIOIzmO4o&n6@jcuN(+&m&>mo9ce*azIE0oY!NCK# zZ`6ip@xIcaz)+mo%QEA_ljyK2++na z15Xt2Px^$x+l8}_A3&Vp+41DbSH!GZvi)LlaYa3oWKuzyR;cmBGP~MxV@6tmI>^f* zDKgFgm$N)vay>Ku6I>*(*SIjtITwk$U(};?vy24}In`%Kv^-|Y8?vprjT?7dZi7X% z3xSL^{YM|wo0e7NJj0Zb+~UVAmFowYa{5sFVf`UlX-!SVnQC2~Mb&H9)YsH?b@cBx z9xKD)7AyxGY zFB~X#KHh_{JXJW22vi{nV%$f1MXP;CiHnSg8NiDwrx&JM0|R|%GSTn(?C)jUw9;co>*A)q{7r}O)_ zlvsG~5S^8lngI9gi_zGmBbQm_yJG1Q2X{GiS9plh-_vb{hrd;5VpeWOLIlng0h9zb z$$Ahd{P74s-a7jH5Kx4BL<3Oz@mKbz=@x$P)WY0{P-3k?tLWJ0b$wmG|LfCtueQ|h zEZdNujr|NCuEoaAi;6%`Bhp-m7nnsW{T-(c!@S?bSZqAnJ_IXD#J~Ac*BxeATHr$u zjRJ!&9i`y1*qHiyx*(Vxb&WQNHL-WXwPi$NX3nadj07ley1Vjr zv6=Sbm=`C`oI7XMH1v*47MA69j<^O{vH*CQz>YVXgs>FAWYNr7GeDQgli;UXNU^>S znBXFQ5g{`;PY+aLCKweR}G>4 z4B}Uumb?2?N^*!w={#*XZGH4+M&_2dXlKnh93XPW7-M0@VJyRHox>Ngu?b_wnHxdA z7#p*)VF(Q#KE)}fDBF9=WH--wK#G_uT#QYJSzE!v#ge`m+^=_YCNhb!1Su+#hd48l z^y5$W7ZEPxMX+?y?TG~c!+-sVn-sj6?i{6h5t0T(IHYGqrr6cv`$}bEMx>SS!s*Yo zA<~*7v85z^#3wclDE^IsBTCa4PX-B?k*xrez*wn_UEw^v$Ikev-@ScW(tO;>_lf4&*?5B7ZN$x)$VdBD3o zopA8z@TC6PwGPcAz#8eFq-J<`8g)FKG$*9z-~eR8jj0(Fo!Jz~#e_-&=g-L{ME#^N z35r(8D{30mf&?lTB+!=Cd<58F2H18_Fsfl2�R78u*O`38aSvS}*4ZXI(IQF)FE2 zkyZ&vMe~qS1+l?>Aw59UVcNo|0(lJ-{D^;3RT8KL0R&H&1_L%6vp_6aV(U%6(2Th7 zM3qVtWD~Wo<(0el5Z!X2v93nQnWrVm;4IC+r&mvY@OpgJ!DBdHVNYod>ZkuKbI#;! zbA8_C_uj11Qz8h4Y1}c2`x?)W(vTsw6Vng0S>n|LhmnJ$GzQCi&TBlM_VxHK5+-9| z{c`oztsBud+khy8_K8Cp7agHgZYTAVn-haU`OoRkk#j30z%MvFOy%tp!XKdg2(y83l$VE(k+13e=B9N;-8%VNYr65l7n>CQX)w{!A)zlz>ly{9#kYAxaAzmB80h zu(YBwFJF_1uH)74f|PJbYuLH>jPAJA#pFHv_8%%)x3?}MV{M+UNmjpYSFL&nt2VC0 zviNZ9Ds}^l)t<@bbuJk(iBFR3m35wpM~~6{&+#U+V+NUY5mEKxH)`0lcC;y*EOOdd zA6wq?`G@*WNCNH(qn0*S)x7d;hxl?e(aU&SIZrPZ*?YovW@J##5WT8)3yMf|vW?&c z(Nli3Ojp+hDbx*S(S?dtX<13jCkAF+s=?~MVHt8g`Q^-xRR<4OZYL$Qr=-vd>-(I% z4MW>|eU)L*;#<16CRhduuB76&8pL zfWcZAtg)D9jM`FEgqk2M`_d9|k{%JAkeUi?F;Qa>M-myT@OD|e$PTc=gLi09ppTcQ zcc5cfd|F0I9PSLG;{YqjAHXU#8|vpVtd3$jEU2F&!tp$Uy#)31A7F)J839)P_zjai zfs9}H-E%Ln+Wz*R|8eh~*IEwOl&sIApj7-CqalHeiC6F_G65!7RjB-2rVoRi7_YA) zi)r3?Bvl6bVi}6@GhS5aUQLH-2(4hm3QX1XN^97{h*nfktnl?jwu84Fa&_Ut*5YY%?318@PoRfm9Nk#fweh8=$ay zr)7+zc$otOQcb3t7h6JB3*zk(7nx z;fy&*A5O~Piv-(wo#|*38AfbIQkjX>7@NSX&G8PS$9gCnjaX0xu(6VvquSXB^ucC- zh*SU>SYs?=jfPP<7>(bs~9KH?<5w|Cy^+KT_R?S2Ad8wHH5 z^z_twF!;lRLuw^n523iY^x=mZ4iLq%wrwjeR$n|*&O{T%^tgf*m!F{=Ls1R86)#7d z#^!A~MgS>=kG_1>s)B-5s|!*4kxjQLjZg}e_;nN_G%}P^zWryO^{Xw{0%y4b&Z5pe ziL+rR1r@Hqge^!O7psj%TcgTu{t(TSimI9>fo3&4&9-mfvf(M3Rk%G#vw_D0y+N8` z3)G1v5PCjfNKD_(gqTDjIE4%ZkAiy;dVh#KX+Z=tSPHs>d-1022`ple#UXMeAgfw~ zG-yr{%R`tjBLu!CC^f1@!G-%;F5kQN!CSALYuH;oxD-NixG=~Y)LG5fU%9mVNaOL7 zddMuz8BOye4Dm$gbmz>PoAz(H{oWDezoIW0DAUpv<`BmCGfcw>kD@pzF9sN6y~gn) zJQyKk5|Yz}ozTvM$1lEi^VW@|D;=PiNgOSNAhaZ@nfV$>ErwqR$w+FYrTqf2Wlfeb zm9HW=IB;cP6y53L#xlb)Gc7A#r3i{nUAWLbmd*GbatoIzX|mvO49Fu%Z-Id+>7jv{ z+3VJ(Cx_sB;;Q8byj_}+kQT`YYJ?@&*%j6`H0a|c@Z2y}Oru%T!HeZJ@cq`F(luFK zNUGgici_;0#eLFVZgs;1)>G<(&+t}llhptp^RjW67WXB~x1+-0` zQGWs&6?GY1uSubR5JYCC^`@IHa7?d1Uta#X0c&ROUQw&BtE;Z^V7smsz*hP!*i_j? zgI$u9>fL-;{#DTl0c;gDr40aEZx!>J_ziUz>POiv!=U&N4WVr((01rC+IAKlJX|H9 zt+d!`(^}}Ur>qB$w@88>%UQppdg$h|>+u#z$NLBS42 z;g4m6QQ!doZe2LKWbm%$y}(;{S9cfsgc(py+aYS}hq;*|EJYae{nj}^aO>^w?`i+} z?|->+0#*YSVK$;Fwt6{C2V{%DT@WpfU~Gos$B-Hs)=}}P2s6gi4v9!{xR(j?bzQn- znO9H*Dj1`~=!z;p=@=RnpBN7WqJsEYy3wT!W_t~TblY|Kf6|REL7${sADJw;DSB=9 zgCG9>$van@57(4!ETBPmJje!pNM@EGs4zCb7$4yZw>egfh?8(4lhL+85h!-?WxP#s z6M&W~Tv@VEVj2ahG3xssNj@6P1M$ib78MohLW+vJ2L%UAHDb zBOwe8SH7OEj!SLk32UOcv!=mXFacnr5@I_i7iUKY`bMJN#7UErJJIe!;g` z!*(!y@`{*(T*dqm*2`61$R4AsOPNGwVk{M-oTp3D+5USsH}UI#{PTxxxo zcm^JnX$5AMg!M#WVMaz~CX*&Q)_n;tky&W6&9lhLEGZ#RQb9pc zkv@-GZMq>RGa)(%rNXTN?f!53oBL9&r}HvbR}Xip;W6^@^Gk!#!m0*ZZ*9H+$B0)4 z;n;gzcS3w&H@l+MO|pE(L}C7D5*)2ks%uVc<;C3~4vUL;93nmkfmBsh<;#J?#tMVD zBOLZ!(_z1*ziF!8=pO_ck`n6?)LljB1H zEbLH~5Al6;O0goC33c9=6%wviS5}snhlGShZ`*(QE&Q$Bx_qX-wi5blE$#q?wH91; z(9pEgdiDI9$2RV5fFjXD)9KFWn>zqQ?wt0V@!6Br1+Tncr9VtTkJ_W);gJcvH^Lz3 zXqm-V%)m{DF*}}2^+4fde(cB_vJKm;G88DEzkK7?jU!E~a$}QVpr-5q?59#g@%R^p z0ze-oRg^}lG?t06FhnR-f$@p1>FM8On1{fuluDjCM-_`=6)xQ@Ej2AQD=RGxO~H?a z8$1x8XLum?1`7Z6>0zt#@^q`YV*IV)07qPXi+xpeg*nHt(sQTO2Tazk*;-swbMA`= ztZ~hen%i$a#XwpIt=)k`m|Cx0>khMLC10F9t7nGQy!KiR!UJm7d1fT0ZfM~bU;J!x z|4z@4X8?Gj<;?m1i&ocbu*XMYN;0oXHJDFkE^^$YCT({Ik&-<+Q}vZA>bjB=o`G*3 z=sVg|Z(LdYn1Mn%=Sam+pK@hst-wHWqcED>UV12}p^T{$S6ywd62Df}QzzZrPz(@S zme##7sPHcC2L^Y#4l2BzhYudECJff@-C8=VXv6BK-4stsJh~js%FHdP^+=-2(bU}a zTLw8O6=?~CB8?7XNzCK=jWCnMTl6fW(HrS-P>P$M|A<6(fYWFP=okn~Fl@m%NIywm zFN_tsZV3+f8N?&Ewdq?qXg+P*0RAnYkwFUQaGdq`_jdmFuTO8CM?&Cs0~@(28A-qL zt!$Ys!fuL@>9=YaTx_B(U+#Kv(d_tn*(I^wHgr4&8lPWMT z)4^}CfD&$oWS`-L^cgUI_7&whx8i7&L3G5kL&_mC4&XsR2klE_oXhHa+kgAvAD_Sf z`njXE+l!DNB&fa^A|npt_yHx%5I&2?XhhcLGh7kD>yM%^Z>j+x{{+KFaq1MNG|Z%F zCI*xu1oAycY{Wfha7cJWXrS9N3?^+k+nLK&;M^im8Ih2lyJju^FtV`j!iAH!J62%} zaHE6b;kk2WOl2mI#VishqG)wQ0vgOf3ufW;2C8rJl*!DLahOj|g1KVcq!|mBI=Ucj zfG%~GLmt}EI8wBLnQuC8&WvgBY|NggTOfuB+{V`435sx~uMdiARsgq{YEsgH9k57h z&;@lhfnjlp@sU{Hr>83?nb62kFVaJ*Ng?(`Mgu@1l9_Sx13QJWk(7~)keLsEVb02k zI6wPoBdr$)hD^YB5Q#ZV7W*F4aMI7;{`k|)@>gDMc>C`k|N8rHzkmPHPpuDHAN=;P zqqDW`!Ee7Y7$opZ)K0FOgYO4$dc<{Vx-}g}oox?W+w>jA2vkB!UpL#W!Ev)5z~p*R zR?)HO!Tn!;`uOe-pSHH%|E2x=pMHP%{pTNkc<=5jk|0MJ{sHZNZPzgOq}_ObfsF&=6=$AhBTQhK0vivlAvPKXdV25`3dk+t07zjvN|MqX zfu|J}$My+q#O20z%{FoIY9?b!R?fQ3C8ZguM~>DXZD>%dkJQ7}T2WGxnHe4)6cm7M zn*otNUNC|aML3bMeI#{EQfepi`XJiu1rODjQlLrz(f+*)^9&!gIA4NXRB!YqtB0~z)vu(Pyf`ZZmX8P{1c)eOw?8EaoEZNS5nYh?T)ih*Nw*XjpPea(deOyqvP~8;366zIXTi z8?b%s+K#mx1y*A`iOD%R2!);8#T!RY)g1*Mb1cUHTkP0ntKX@Q81mu2=gQ+pWM!sRPAdx`|9wsu_;-eRR%)bD8IhQ=aB;{lyec$~^p3!FYl0pHmBVmPn3@tE ztjNm`4M~U(6dbpBGNTGuGP@R{Z|_m=J!bBFl?Bv--4%!N)F>Jk!&#KuQDQxb?}dum>3|5u0j?SldvH$TBf z&Ry>|Ql3#b*s@t!JjlkQNBFhf_M$`Eh>hIUjwXVRv-|+W zFMeZ?!;jfmUN#K*vxrp?tRP5LU@C{$NIN?!)m&e-Ifin15~x(O+n^D_My-L3Ckyejc=m3LeO*leWyvZOL8Lbi76E!d>;ykt+KL`iuh^!vO$Wc;{ z-e5jN$buG+_WgK;qJU9Sk8H=UomwpOMqrcI*Vo(q;K#2Kw@_CNn=T9a$X1#0h~yJ{ z*pfxq7(+m2r^4hEqzX?W_aQYP;J7IzEJF7`J%-_7hFCq7lXu?R^jvf=^X1ppyD<^tgVJ zVhD=SD4vy}A$1B){v2Y({ILoT4hdETcsSeRc6HeTCl?Q2*k8gT5&ecjxx5@09OI)y zmB=J=Tms`C4D55}&WAC4s<5tm4v<_*kOa{d&qX5KxbYL2Nz*1ym^c~gal-hqV<${s zuymP&&Ahn_9h_nAcV4#C2C1WPC^A!qLxoPn$@0uVcCvFf8786hp)c6|82()UwrbHfBez*%XeSg{opU}zx(BTUw-@dTkqcc;4dHC zdGDQf-oAr>-UcEyoHRGe_8!Yg*96*r`7>xNd1!l)v?U_$ zZ2eCYRoUKEr%$U?OsPKi_Z+5FT%N5_d?z;w@I>Dn-$dlf8hALuvk-xhn+ppHLPC+& zs_^xNb<*0;KMk#l`2~oXPEEvXC2prbfGYeA*ABAKu*k@i6m6;{?Tu37 ze2&(e2R-N)o9&2J)|q9`@P(Q z;r)*a6IFC@(5{-36`GxzT_$Q_j#@!(HET*yg>ZzatCYalRAms3{g3CU%uVB(P44(e zS3FXp=M5j`mZ=fsnvcLgF-GZ7_9?`*DY{^ijbxKjKEV6DuqHk@c<-LQdm|%CON)z9 z367^pGFRehGF+b`NlnhO$lHX4c1&0}Zb70tVz?V~uKk6~D=!J=6>5*eZB`VfpP=MQ zbeVfxzIeWF>jBtScu2B<9+k9+iaIS4-7+y!MJ0)yU;G1lj}$J|D06jyPn@v- z>jgBqbZeq!gbG5^UlF!NnO{)ALPz!sIbFQB?J6Cw**tW9T%5z`*mHm;GeR1|_ zLQ?d_?xJES$Og}fvtM*G<~8N92Xj}Zp}~5HjocnHPp?0*@hA%DEU(wZ4xy2OlhZ6C z%f@-LT79GC^LO>#1jo->)ao5C^KcZs({r@9-blS3Y!s@2=m`*P3`pPnn2nnU*|@)+ z*l1R>aerAu8JsM2e~@hK3^ zFtgByD3vz|U>u4Y%F4(s-bsf}hCbcD6kQm zL6|A2R+PS`d2DcD@clRlM^@L%?+zIa-&~Cv(H==}&tp1@I&|&b$V_E%%cbWNQt$I< zrR~ z;XXRZ*Ui=4J1{6DSnj>TVF_y^T4L$o>JuClmjEz=i)_N2#N@|Y!yzuhi%*`(K`wr0 z;3Acbf{h5?(;+66JUD+QA{K`1cx~UK_TPX0*VlL7zS3O3tDsV6BZeEwr9J4}v1 z{RpL>r^_-2EDW7SxO(7$Gc1zIDbg~sv$N8Z*o2Yj)$?EJVh58xnx5ytQE9Va4l_eE zlbvNW6O|7RjH9`equs*UWPO=9iJkZYoRi~`O*Hm}kt4@WnY(z&g6Y#{+PL7=*=hVT zSnq8XFPt&)#j#_lvS$q4@j{nQpE_;Mf)VqVI+2K!BLEdkPYS1F2#-sb+F(5iQHkZ_ za^K)ERZv7~(e^DFZsRar1*#8K+aX)qh9n*AyM&>rdyAXNw#ZAXM6jv z_kaHWpI`ms;lP*g{PnxG-#Y&G#odqY-u>{-M>jwG+t=4`y$|vD=B=AIuD^Zz&0E*e zg`)xeX0F-Jaox5TNkZB_d}!O0YwP_z_a*+5yW?%^eTUCfcsfr|mkS1iErzi!f@WYk zsM^BIR)Nkt&J&%5u`bbhqX&&?x)gK(Ck;#vhndtkJc0t75H#B%7w<~a1!05}_&cm; zFRYFY3c@Q$d}u^kLgvQo3_Oa40l-LZ;_HtpVgHXo7HcF2B+tH~zV^Z0kKTRbBBE!@ zAydfvnMmw1@y>eB&tAX%qUbAU`*)hUzRrLdbzavnG0l)H| zrvZGF0F37e0C?vCVRw1DZduiW-FgsPPIyUh*L@_7Z|KV;deWZk>9!0u#0@Z163kqHyQE#WlI;8 zY(b;^npGLN{SU!QdrnGR6mpv469CnC+)ukKLj|9!E5hdH&zg>v-h4A#jB?S#7axo1 zEgL@vp+Uwa z^Ftsg=QoUxA*Uy8pcl@He%fl%hqeNB1Mx9vuyAm|i{T0ncVCE91heC+57@=(1If8D zvC)X0aa}rp<_ub5&R<|-XK#z>a0L8ego`tTC3eerD-LpJXHTEZPI8(!VH|k+!k8CE zjT~-nZvEoaS+k~3n{DIjAF$E|zEN`II6KUr^5UqG&*OCMx#wRPJ7LT`Krd%B0Q5@m$HGcR8<`DzZWJOpMvr}QBIe0so*(Own7tHz=$r%=W<0a7 z;=wb8Zf@E)-~Q|0Km7Ic_r7_r?9FfP|NWy^P90ZY`}&6m-+%u0KY#9R?`&;tYh&6; zc_JgM1JhiTfQfn`R6DJ^I=cG*{ljnVJ)kgH+>3vqj<`!lGv6)>(x3kAcmMv!*I)ee zk6%B!_Dyg5{kAXv_K$yl_1T9Xe)PtjZ@#*H>#bWi-@J8;y=ihCbKKXiy!t9n;@h^} z+(pOl2T8o*+8xJSp2W9p_uboPdmE4~y|>-g0#O9k1PqdKSgvJ$Y=JNXZ=hLpg9*Qn+fBM)5DX zwYM8u+1=pePD+iBiwsl2`}|qprx>6x=wm@(Za5b|kSs|`P34kha1uZOYa+EEt#KHx zbd&|F882gJG@Riyn}w;=7&e{=jQq8(`V~?qlsU4t+#)Mmcxcf8X^SIcn;1aYl1i)! z$^-~I4yf5ieUlak9=a2g*xNW%y$41I->-BGR4T=e~zSvTt5`S9)sZ(lv%Sf}1vyve}c zNU#_8d{Dzz&t9tAcCgWaUhd3fp!fX63upK4tk_Zre{p;wj&>8$)AQGD-MMq`q59L! zI#_6#bGq}~1dFd~Rq+P=j1)MUcvY-lsq>mh z`&I;CAvv1{S!>o8mhU=*rm7n^E=SaDNXPB?qYQ~pS_YeDw8+NZJBh?EooE=RMabp; zUP;1a_!nL@4@-_t!WLB-s0b(YmmN|Ut`YovL=_+^$k_!)i+MC-?P#o*}Dhk zAzt>DRce~Vp4U5ww-uGC>dfq-CwRNR`cJ%VYTkFM|Dp+2rD$19A=>6<*sR!6ufB2i z^V|AIx-K23HhQC4P`dB(N_Y3BXHn~yGKAWVwJ%Xf`&IGIeZ11$z4;A=fLgZt*Q$X! zrr2`J-q!~YHeTH^&@{}Q{NqS$McAw|y-4Kc zBT8C9ESvzsrokd>m%;p3-|<7IxC;{j%kB;;xxI2?AFd*+^_cgHtAJGzLP|tfijKfi z6x;v2EIcHJg~w%NM5&m7v2cn)1_pR7$5s!ye~TB*p94;WGvUAZ`TY$wVQ`3g4nfBL6u`%bOSw|tq<;h_tl3t zUpjGMM|siuf~-`u17NzGn3j;oQ|+YIJ%X&snzJ| zOI$nyf)VQ;ALj3liHpY=_Z7|%#*<$Z`kqFh6L;L0=PWHpj9xZo>ine`=&ta9@47-%-^m* zLkNi2uH9X9_Y5)Q(2Ww(5@L&(NTZ};cVMp_yLKx|34++2G!ip&-|zX|Ga$M?&-=cg z&+g-{xX9m!neTnB>s;qZL(sA$L~WBDM{GkfU@f$)Qm_ z4E2pf;n216-w}#j*U-?^)K=Tp*t@R&dt>4AH{agA`u48*JHqsd1a7NES6Tz2_c3T0 z`|a!7m!+j8m2Zn5KP&lA|Mc_Y`}giWDt>hL#_g*&Dxcr`=jPR`qU-bxxyzR@|GjYj zJi+RaR=xAI-wvWK8G#F2!Zu6(HPVZs<-H=wztZnDjQDPS!B=S`LwhHZ zy-1r1P5Kz2;1b_Ex`w(4S|c{I>6EHKg;r*JrFVce@y}p2!{v279LCa|pI}ARO?ui6 z30VIlZW*w~5wLDaYeTb&RQjPat&)orLRMLj)!LSX5!(uFrEGj%MGn%g?oRv<7&NgH zeFZa=W`>}GGROzDpOCR0B2N)95arNI7#T|xdnZySq~%_}d;j(ov1xZ{M?aSsso3ps z_npfTi`jOBM)txe`QYKBM+&yA4&=ez5hR#}I;oJ**^x1^5m9bSGPmwMKotl(h)s&pj0oVsxF zr00>vA45f>qpS(=vneWNH}VcpUW zmWooo!gkw&v2l-OSsgUJe1;(|pEmo1dGwrq60TyojwvKWk2e$v-t~JkhLS z^O6>LFq)O5eRZWN1=k~tMXl{^LQ-tP7;UjMB*Rgl1w&#QLt=7Q&%(&~Cs+j#w{*J{ zs7nUSGT^ERze)xQw+-@_9Gp;1(kO|q|H`nHg@G|~h+u#WvO+a9^r)-(SdF8|{B#0V zDp`~wL#|BLh!R+J z(2Bzfo$ly8!Q(bcw|t>ir{c)|H?*$riq-??Z`^xS`sCT`4?wG^j+mnaKr8v1(X4;O zYYU}G0>7FY>c4+_RetZ%iM^XLlU5=k58Xb)UY^i+~#OZ6OQy2II2;xCwSIx;Hc>)jy`@c`324L^MVJ;8ldNyBVb-*8f?2m2cZEAyzAe$XLp4j zy?XTP@1^(pD=p(m8a48@31iwrs2~ma|3u2@O$>` z&XN^LQEY7SB|co0e~+FmJAdKkg{zNu|9$IFGQ5_1_Gax%J-Q_2VYsmN{PY;o!@IA9wD0F?XheQ(rMth^Tf%UbzU545 zNQ*h!`!~);k`*oCEZNn{p451W-+`igY2?tQei|Byt&-11Fxxpt&Vb`d&r9kR9S6!LP3+mjR;3xaXC7v3DA6pFn#GGVNFfUW+bcBt7tp6H-9)OTbIbIhZm zU6EZAS$jBuHGZ^zdw>E)dVcENPxJXUxJ~KQLT|u61?br=;yj|KD`&VuD{pGD`3(Uj33tXX+oR)Ww#hNwvm? zP810yBd@<*L!^N{N(l3o8|q%hfW#4 z`^b&E_iv$NW=mG`N@5L$SszO;-0j=J`n2oh^{vaX(G_8SOzoYrZ-2qzqdPYzEDZOv z_XwWl>yc}1q%&^9__3oWXc+~C&yEfDTb-G_cGtcFNLlJ&+ac<3_r3EAZd^+Tc*RRz zEP6K#5tBECkQc#flFAuGiGsWo$V;1zz|f3AFB9h+7CC4B;uUGcJ$&KfxfypC1%3*Z z!n_#bm1D!_+n70YidTGN^opG4;Dn8q-I`dN#nI6*F@jijYO)|zIwy1A>DGg+5+Nm@ zesJ-I&2#6ZT&Sg15e=J^EjIrKW@Y6_H0-*0q8*~09o$`&mX$I)Dt

_&snONjDpl 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 z zuYYim)4q+ncOTO|d)C0vc!%Z+q}*&h=@C&9Q##aKVB6kO-qkmJt#xcV|B9}$i&uDp zKec-MDpmDWm?v%8vR6xA`Bb1_prf&*y|-_2ptW+Srz^ky#)AjL-IHVEqoa3wTe`1b zuj_dC{$M$d9NuPtY=4BFsT(r4>R#3}c65d~b1p+{CvH&d%MS?fb#XMkXrzDEAY|50 zm3(iZ^1EXCc*$I3!C2zH8?Glv2)Yc%es=`r`N4+^=BYt+h-?&mxY#CuC|)>GKU(?c zHA7Jmr1H1DS@{bv^k+MOh}@s9{7*8U^EsFSS##X|#7+wQsj0T9#j;GzKUwy1={*1bS4zn&2oGC&et?4pHs585bFpG+Ra1UmMs;ouhfM#;1W3Dq zpP8AR)12QBRvAvJ{-;Z-K1qlQWUKzf5XpLBtG;UQz{pT;d`KEw^=XqW=mIPxr`Sk( zDXk^DQvL42&xPZ&&r;LVY)N~B6RbOpvvWuV8GSE}mRZ@oQzA6ng z0eCRO#5e=b$|#J1ysx?vC&-_w`LRoSfQI)aHUF1L^POaVftt_x{EOL9wZe?1c4^6P ze7oe=OG|#Oq~t4iw9S`%h)ZQg6P6VHJ8aQ!c-$;R4^U9HSoCRVgt#sd(qLm0eE~@s zKo3yM7JV5(Wntm}EL44&FRpd)uT7t1~w06`y=l}VgmcwupAOD?a!Miao~ zspFL zG_x|{mXn?wkN6+de~ka(228?#!ebJb)PD;4(PMa>1t%8NBHE=A2X5r~k8g;A?DX`! z>Tb+`eopHDzu;I5T@ZvpWcL4D^kViUj;&|Jvs|(OhUn=DK>#KqxTa=c6^6o3M5P!D z!7dE5pyxn?7@krD2*RV-2|!f(;@Pt~@&8m=J0-VQ;Zje+0?d>Be7vqg^lFcm1t*ox zj+d}Ur0rJ`cM-^gEYRUXqYf58LBeHi|0v?11;ODtJzDn!j2v|!6xzCJ`OR%5GALW z_=!L~B%&15jyd`V`FLJk>+XtQ4cSJU8R?(eyAE?1t}OQlY=KebMO+v+av3xb>!B)D zRA0O800^XW=+NHH>$V<0b#S%pe__G8jqA2-+`5^&hBDDLxM+RR)zQ(_CBXP7CPCPV zp3pq4vsP*IL9H_vE|{&8TeItg{zbEW#->+dF%k&&3=BE5>zJ{%y_JKd{*GqUy~)W^f!gB{n0`)=QRZ)B{sx251lZ*yB$ZQ0u_km)eC3lJwGgU3$n z@n;?tDs<;yppvQ)8;mIdtUV7Sk{CK6$veaI$f*?AeBfr9Im?_;adC!K8n%YcV1XQK zG7MF-ysy7kaBx@{#5zgEHA-hB?SRLDm{bDf!I8! zf`URffFMrt{_mX!!R)O$^8W7#6E-SIPK~Fh$?N}b1ISPl%dRu^Fyw7>y}fr;R< z*7?_e|M0bZUSx~p^^dKrshK%(p9+gjK}vB2wgH$1k*pPfU?FS;HwBWg6_x5T68SYC zu&{5P&x#)5|Wt^rsD%Z&RbwfpNH$4w z@$L*A0GX0g3nX}sqdY-CQw`v8G{Vz7j8Za@mY;YY+f(AVUSx z3m70IQhZ+40JZWgeR>sZK)(kz8t~EBhIZhtc>^&bO{TQ zk4mML)iot01yFEsQD^B)VYOCf20yDhBRetkM>v2$5nmE0(tphparNj2=pLQEp^;L* zxE{$)z?i6W%;2m$A1cg-)px@jUXuKHT{y0KeGJi$(&Wcll}ZeO(i43;f*SjWh&*&B z3^4?u#hpE!bs0%Xv9U1`?yio`j#n;Swz9Rdy#$BltDdx%B9dVcD-K1f5c=L7Cae#k zgEX!_ENUqRx~J1w4E%;3W3Ds5mSCWtV4x(a<)<;gsh4t~^=mlmT3Lyz)`+$G`?TvM34dj17s2e43ML?Fkk>v zSWj=PXyASk8o^?~4-xf&OyD#0;ON8s)&0D^{G+qV>#+-{#FYTuupI{j$Y9INE^ZpQ z`N8ME{{0{S3g0CRgVYt%c?m2NBnxMVAckbA}eaFt-$bHm;7t<*dm#~!V z{M^(KSL+MMkq0T>t*~8lojNwVGD3{?@qV90?I%hdxZEmjf*OdNk73Y{I1)^YIP&V7 zkLlvz;KGGJrx_e9|*ibgYDNNi1Z`KUof};wrD%y6>3o1ta{9 zurN5fbB!D_>E#tW(dYl-KX3DcfVVPTo##epei9psqW6 z-o)Jag6Vl3&8=${)pr~|ZeZ@@PN{E}r}T`?S8DB1R-ruof}>)59Q5=qLhNOD*5LFG zRXGLMbL+O9D$EJb47Tm;$<5@)q-7PBeb6~6TNo@c#!<1T+ z_`!|)5ANN+Gc`VaXKeUde`S4BPvh|Q&bG>ij^=B(hWeUIn|rEKi{7sPay3E8$#!}9 zzGRuOxX3EW8Ka%=wBu_1=axqC0va~#bu>tWYvp{sM1+7`j^ym&9L)-67-Arf1jY7FRWL>kcBP!MbqT{uauXb7tTwN#DOfRKvN~YvjtcK ziv_C1uneiG$i?&@8c;b%fifHTDEke#Va}~i&TGi%9i6zl@chqOG~{!%8|~!RH@357 z{~*RdEoPxH;USl7EKDUa%(yE?BnUDC*uY;r|Iyu%x<5*fiLWzbDkSiiOo7^(>#J4D z1$q3GxXRw_jv;mobYyH|s@W{}x zz#unw8yhpT8RP9HP=eZCazvUuiTst6{e~{~^`APC*hF6czom&a<8LHozjGL6zclej z%YKn$`rlq6dH(0US@!$kNGo$gkk;`R@qNkjzkTG7k7PbAYi)YgJliBwpLb;W`+q*~ z7j-{7Nm}>oDx`J4q!25B*%{6ky)$3Relgn3s)3eQ{mxEd7pI|~tXr3K0CACFctx>m zfIQTFrr_)RZ}Zf!h{ddk4P1=ODqdIuun%QY^hw0x?@;vbv%3ITQD9RlhEx*se=*#S zL`!PE5HcVNY4Q}D_V%LYEjZh04g>?F^T>V6v1JZIGNCVd05n- z?EBDOjOS{H!I*5&9a*}4TB^Y`)cjYu!4#bGEZ`S96*_Nk&cho4nY z+cWX*XTSX2|B%Egaz0GPKg&x#jgl|NzWzZdaswb1VI#nPF=Vm@qgiBrVEV(5xetDt z5girIynOcb#f#@pU%vj=y`1>CIQQTTabpSBcR zsA2nymyD$3V-H}+7*WPFeuzv~;q(h)9~=be;2L1>p543mi1+R$_hDzvJYzGFT;OhX zQfuG-J-hHh*v=l&KCpZ1hE-~~{vrYJ7@or^Z-&|hp^kzQOw(bphr40PWf%!jMB!Ii zwQ1Y#g9rC)Tfc7Qs&$&XwJ=iJvt^x{f(&LrTn-l}Vhl$fm7m}O-3?H(mK_Vps;=8{ zfDJxE3gm$;EB=koqqroYN-TqklY$6K2mDy{FQWDw-l)3n=z0Tc7u>#Ge0*FTZLw>$ z)JGJup{a@PmaQ6U${Y4-A2D%t+qLP)X+3KTN6iD88@EvI?k-mYc|KOA@GLaeH@R?p zm%6;%5I!^`D=f5*D?f`d_;3 z%|@KAWZSD;TG1fLDH%HjienEE5N5P#g8U7VaZm_A?bCk9%o3gI*!i#tzWHrIBz ztE{F@Qtq{T`-eLs{lh&%a0O;+gnDmk%1-^^HO^;~busoQ^?q;|1%Gao8BxZhrysex zEe*Am$|Z$48A&k%oi&nK&&JW~lN052ojo1x4ws;|u!1$9g{3Qo$q*H;gc&;Cl38gf zaWR2d@K{=i^*QGuvJo3@H$wKD6_T`Eulm6IE|PubOY8mRu^6`Ae+8xg2=kSs-nWo? zUmho^_w6lBjmeAC9%;S5Caw4BKU(i^3L4mYKZ~-$X&++ieH-fiOcOWvjdJf8npQy4 zGw|;*C*_TDU%0&74=W}Lae%<;~3c03HbK!3x;I(8}2ZRUhAd<`%TMI(gn3;(P3(6*NGW zxBwt_1B?l6x)!fneO(w0K>-AZac%8`c#-cF?>n;ppw1~Xw=i(d-Tc_LbsKhS>*#1B zM&s}iZ502*`?n&;U6nlSQQC3#C6BlNS}rk8KvLnV6~qS|V<4zQ;UT2JMe36Z4CokY zh0@xsTDU4WeN21z#+8aP+((oe&Hz};a7mva#6Fnete`lu3W`WQT)lRK#)j3ZGPBqj zvqK?_lwQl??tn`+4K(h~mezgKO}jR4T65Iuu;DSakl-thKAy0Ma&+^uH#l!(WN2z` zxO3a)RkBK&dyW}hv_7$Zv$ocWV}|QAcWzr{VP|f2(Jd&_)6T*iKwP1xy>0F44Ojcx zaQXYI_+|NNJ|QmFPM18RN*fv`$NKw+21fhayGElZ(^I=bhDSy^ zYP-5x2d=e1Kh)S&S6$rNcWrF2BeS8sxj|4>SvT0z*IM->b-ywkRX;QAE8h2^Gdy`) zclXpp)O=&Eg*DE6RSk=R13YvOozXjg!PHXiqP??cP;zQ2q8vKP%f)U_eyZv#R>ed| z<)xwOi{5B%VzMZdCbY0)owCLQsk=!d%CiSKq5Pkc$yZ!HqTFbJ1k zf`y`wsm@}yL_wbYIX%6C7NYRsR4=djwF;Dx`a zgT2S}$Y5nFd``tZI=z_b)Fda}Y$qqbDE4HiW8>)V7aEu5UF+rAw_#in0=TUiPL2db+1z zUVK<*hp8oEf^+f;iUhExi;F^#7uI?wEXN4@vn8|ngqC_+LFNl2(6gb)HD)O+u3)a#6T?_CH{3VvZm3At23DIXNjF&Jm8a+ zZbflkR(3(fW?vG80sq@(CB|uqkkg#>^uiYLd=EDaQ`yS$o_IbX@}OQ}E6j8Qa?W<( z<1QG|J|$Z6NKH|MR!!`gqL*`066yx1&S?6@NrKq#NYOuPz4% zUKi+CrIh>%Zdp!pN={jMzKHlQQkF4kIl*5OmsZl!KRPzlhb%cJ#1t-{wuahz=sNGR zy3SYM!sAJZPd^qs5i-0dcfRxsSy=tajE@mtj({D16Y+kX>~|sR2w}w~BmN55Z?>`i z?BU%9PoF=3`tZyDzBY(yGrFjIsJF2Q>3123zq=qfuNZUobdXO_6d^qbJQC# zb65z5VZ#c=H!y%cChL!`0Bl+#BD9hrHH6>-_l@X?`s!V2l?0X65A5$6> zyqjjWd)>UeJ>B-(n`$e`N-R^#kY|wsM5FW2da3g#!7olcuI-N?t(e(X;2`lH<=t9!Jv7L2Dgt6T1tO z)6Ml=+|s7(u|B0VG3^Ut62~S=QamQ&N1%-JG+TT>`V&l_h*-v!dIpr?Qc z_?Yf*y-fNqTNPSL>)KGQ04&1M&uBRqyRgd5Dr8o<>};>t(K9g82CocRc3-%Y6u3c>AW=Iux^wOUM%TexV#4OUJmd9O?O1S3JCCHGf+0?Id z$UAZB%z3EBIRzzEja?(NjFc06jRpN5=_|sk!p~XI4-wE$WKK-M*gv~-v=@W^mI(9( z;{^0`+dxlTJ@4-T{X7Hu*-;ksAv-~TGMz2P!)V{!PFf}i=sQ>?2j>b~q?h<)c!Val zo-AZHvypIw^w${Dk4Yd7o7M0U?}KzzQtp~lDw^$yqw`NJ=~+i-US?W0S4{fVZJb{Q z_lSy5eC{ilkIC|u<-G9mcaNVwq8_e5z@Z;VVx&j> zFF^CSOa~I|G0f8qdL(WlH$4fn{P_zh`IRi$aliEn*)OCNHuR2;kMy&BFj_z+^2i$P?g`?L!yD`k8TVb~?E}&H9naF64nyLMs-PUG$8jA9An7&n2 zRUqP^ah2#X4B<5;6t#@Zteg&c`T6_#xH?-KX((Vemz0oG(V#UI)Rjq`90>}Q70BQ) z7-Krp;DC6H`J^F1QHhD0gR;L01&1tmSE1sNd{F!qaE@*XIPs@XhlfO3$cC9xF@YAr zK_??lM+S!+_l*ef@jBw^w%5^2T~1P3+jh_4V_v38iW+vdhuqFtadatjyZs)aQIRnz z$uZ|n9uErfuu@Yq-W$`@-d{I>>8vyi2?Y6EUPo73Ph(L^jE-|~bj-=HGtse$F;N#{ zLcI(rO;=OOQag66yRWr!cxZNJa=f#?cW!$ABF-!qmnP~uMsHrdIy~9i*g7$noBQe@ zFU_Aie?FU;b)5kbrr(neQlkUssj-SI())$N+hiLLIV|)M@=T?g5^_5{E zk>o`fU+1ZIkCH?~W@4{_OmhRGeBVxvKNX4cnAl^Z*21VLV7%jOJv8~5deOknBLjOg zEcx6W1AALz@R5LHy$CmB2KHq}q*-})<-LvfC2w@r%X?wvNyHg(Eg~Aoy(l{LR}R{`_Y@djI-te`|GVKFkU* zR8-crws+MhFD@aX2kqP&3(#h+Tx~vGl!v=^Ae>=%Ae=bKSs2$FTH3qevnC9mzqoj5 zX=&rKG5~&&VJ1x29c}VWwO5w9mntTgn5!)1>o;!q)MSm#&khuyuj!&YjRA3Tl#8_@ zQvsKrf;@(Z0FS*We>5>Rrj6`P+#}Mf+W6f__$tfK%}9(pgD7xNJTtGTqP}yOg?P}_ z%%2iH{!jE};bq~UScngd0OAYDVu+7#=`)fa41D_Abz;ZA@&-GuXN*tcl4MR1<2r<# zk>Oc*ipImBVIo`C5#>_ ziA~C_=^P#(8(;~JG`vBQ2#);D$!o~(g#G59Uw=!Yo?*Rtgu7sd;VVqasPLKO^A|{R zUWEihvKQ8wV_d>*3jf494$z3+v`%bCSU3xq!T~p^^3NaKx&P$F@{@1={K@y`JIgM_ zWb-D+I$#%K5~{H%CXS)#6UTxh&qYUq*^uFhBojdUbB-OSgQbW-gB~WzZ}q4r7NVri zi=5`7gw%OAq!?fye!Q5Xf-g;2}iCI6K*x8)_)Y zN(m?>d80i(L4p2Whiwhjm1u}EM1mpKe2ERt6Ua0=GRm5`?Xrdc#ScMu9tWLFHRUn9 zuTu)LYWim8W`aepIb0@X?o_ZtMd(Q&2{ashj}dv^CwxHv>HJGC;arrF&Y1X!tv?q zmq`8`+trmqY*&fiF4vDp&dN$|Eu*}=O7hw5B+p?;K0_vQA?%gRM9z}@QSIY8VH5`P zaE9d7_4ThMdC`u6yy5tffXo4qe7R3@pzpRwd=atyjn0~hmsvhq+g`?I{BN{=E~=TS z+p%30wkx6Rte;=gN7VMZTF!9Y^L{(*R$FVkX7cB6gXcf}=;^HEG zNoDck!u%YrTStcgbY8Q3UDZh1{lwf%*RiZdL02#m*Ioho84}6q zfAq+~J=SI>#$^5Fji|h!mX7weX8fi}i;cmD1BhN+%^R4$atrp#pevb~1n7UEFA0}~ zf8GZ4rC1TrF$!!7?g0AFSfDR4K+o|_cm?Q-EYNvx{7vu!5zvPT&?n~^pvwd3N09Ui z2OfGTh{ZB2rMy|Bxi=4qiQY2761|u2zMbf|L_{yzBzoiM_!5XN?AX-Yx90NPvKsc% z>UWsQ6*t$b8R}-% z>e0hT5AW0WRPG~a?d!jP`q7Pv9v(LSFqQG!=?;a?4*bSw=aT|Yy3qvR3SfH*r1pfY zlBybRX?AjIE}72ZTthfB%XU|Y9kGd7<-CEh@gc(Ykx`O#+SiFXqdFW~zWu{re)`#8 zzWDN+?-=EUWULYW1%{Ya7;0o-k;flGf{|kM7h=MV2acnZjW{rS(|Tj;LJOv-7U81I6dhfqKK(&LEe9&`5O@sNl! z@Y^#1Y`{EDZHf3!Xnzdfg>czJZrnI33CYn<;Lq`c%6!P%)BTW(Gf~|gcRTMr;Ogb? z>xJW0w8^--9yuBq9u<8m)ZgRaepkE*`}d%f+DJ!D0TKH&r6+CTbv`-y!i6&-UVC>L z>uG6gswke^^cbJ*wRO_siXN1TjRG1w!^ljQuXnC^8wu*c3! zM_J}M*0Timk12JiFmeh?s_?a={aRH8l`|{E)G0$|cc}aucovwz1`dVD9$DGdZJbwA zFgDkhq>L@h4(d||%#@p0Sh;%sT5uPm#eZfxxw65*&~t7Ep;GsIaY zdzY!-EkQ#DrhQv@U>yX0Qc;4#YvjWT}yr>c0@AP*Y#G8KkgvK%0pJTEv-( zR;o$})@*2KZYB~tAU^`gn-R#@bx-Hdz5UjQKl|~AH>P`9>YMppy@UOoX~7;?3(*d; zu{Vn0pP!#!TX4Y8ex<&iJ3kQ;2*wl0`;wtODKo#cs;-GgAU`q&j)L-#{Y~vCYNm@UNp4d8gH0l5#Q74evJ(6lAm1UUs^-3!mT#Jf?!@X`@$CF zN5B+L1?nQR4eeo6*+ z3I_V^oL|NG{)jAA85_L-q^BQo9>PPZeDBV8-~8kEKfXQF$H%UpZbJwN>MBK`XPTPn zCKH@FBhv>v)wsl*Qf>{mBo9<)`2L=@;+L_f!|=mhi^LdK#~^r*Wp1dWhLIg`mz1>#iltN35@RAm zj~(?oxYypw!rID6O>zZn$23kNGl6MMMO6)4ADLM@?RWF^^!D@jcCpYBC>blOD&vt* zFxc(s<9W#0&cXmBSCCiH&{mZZasDa(eNY>QWv!~FuD*eRo{ko_xpI)RNs8T*Z)F!No!SMWg6wM$3O5)Ld=;%hPqzo_uF}go%Hq#vCrCXwy-eK)xB`3 zb8LEKXkxUxe+16Tk*V>aOG`70i*L;JwGZ}9EX>ZohV&I%q)$7K4N3SJ;*6p~UM2l% zp|D7TMSX_|^)+OTDjMdOOHlL7qJCl<>gx*rPt=F3g$bjCXXK;Kw)EFGV3>au^`$$8 z`C7j%)b|4Q%WthQ26+bc^MlPDub^JOwzs)7`z2`xH?w(VwahM6z^B`lkeFH5P|3*a zwY5TU9;s=yEp^>f`E&2Q^}$a*x;;PGGcY_j*jMK7<%*lRz5CpPPo1m1oWLK0Fikj* zM6@|xL+%*y&3Jh;@(lLUajDsbW$@+`&_gQ*C#Pp-=vm>6^7PaM5{n1=5J=rzUoDHA zm#gIii&s{Wn4@z2=G!-Tg9s&4bZ0cqvyo}rKo66$x6sSl!`0c= z$`VN>-rg7id;%gnyE=FcmHCC0s1UmTHYmTuQvPrBMd70GuPo)SkE~r+3Vs>#(**Lp zJ0M@_8~GCCXBH>KkpHXTBP7s2U+4UQMCv`IY2GXlHx z&0FJjGc4r$#E}1QKz{wdal|E}d|oh1`M#dA#*y(}mhy}`L;N%95Y({YF38Tx6VLL$ zZ~3NKf!(B56y;>3Z)ZFllADabAr#OYMsXJ*9)(?SNir!3PYL3`0p3^PjVE}gpwS5L zE5J7M?U$eZ?CrUJKHV&AacRW{6^`?J-f&>LHeT`JG2#HKX_zn|2wYt3KitJ3BNxi^F0RHM{ zcmMwD_ZNC<%S)>G!=rtz4ORHBD;42AxUYxeemX29EaEgNTfv1r9i|d~5{IgxOdRYn z2<@cLiL?evqB9$QN-v_`;ENJtJhIXl)PwctCU!lHOa)iudLhjf7T);ynA4%Y2lpUJ z=Kv9Q>>$}_Da*?s8&gNY!8bBCDI+xw+pEM#A4g;B-McN+V5B4tM|^}4)Jw}9P*hRZ z)-yD*wA-`a)y>`8*W1<6lq7W;T3K5fs;g>Q96(QpkEffnjfJtcx}mj`i84`TpyE8m zDXo;WoT7?`j=r&(g@qaEq9ooO{OmMGh2UO8M^8^zOO3o5P<2Q)Gt_?k+!EV}?`%v_ zre5g@$0&&lC*<^~UDi%6hp^?fad5D4+OvDFm5H8(se!JMoT8qN^e#h+GPhQdK5i?i zvd81#p1|bj=1+2dZ+NVGe0XwtaB`rhtGTCZZk*rSH8j@W z(b?0|)!jSsZ-`HJtYo$i6$D8hKNUn)x+UOH6JjO)aUCZlbUjRPMm{F(EOuhoc(W~{>AsCo;+vWptIBpDzs3j1 zA8%r&`}Qez=VX;^Gsv?`)lBhH zb)B!$4kQm$cURVvo$Bz&<9-JClZEqd-+J$d?_30*$A)74J-ywJ96of|HzpN&c-WEm zFI^g#ngj5K7j4n3*6CMMc0T%;ueTR7+6RP0oJ~l}DJrif#P22zd!u6$6C0B%s3ReJ z!k#Xovs72ej^)nvcFkR3#(Je2w=q_obNYagKF?$-{wk zBY+@c@spP#kBuBjbEzpZ!GN>Z|yU{qvyxPi}V1ZjSWAE?M8umuNq|IJC%)^dD@}{sTh$d%s>}Y2Q-7sy3Un4@xZA zq&=U+1A+F_jk80H4&Tx5e(iJOjNi%nDnBvnxh*5()t!)SI;Ejw!EPxwOV+VnDw|me ze*o=;O>!hD6Go@ZwEsYRQbNU9#Xc1WvHt<~O84&Gx%00-ViX?WH#O2tE-i2_ZNZ+{ zW$?R|eSOk#<&>CBR2#rPEf2}~B1ilS0f;Ghtd9)Md^mGjEJdPiCw=+;vH*@g| zMg5nzlNmyaP4^x&SCNoh!@t2ZN{@rCdUb6iW;*PFi_^~BNKZ#oO+|rxOQ3g)!V4m= zqN!(SY^1NNsj5hJy|l#B&1I`4#nE#*7IjvSlFQ6W$Su!}cHgCCY3;b*-O=7iLsMNx zOZ72nc-Tq$tyxews;`7DY!ot`9Rvul-_CjPfzh|tg ze=4l60%ixq{@0XNlqBcMDFwKP`=1K+G&p2oyw^P7ct%9HtGVB92kFv==Dxatf%c~I z`l0rTp^pCU`u3{2@}7b6+S>ZMoSII2;|?~xCPtGpG)6_e{s`$#$Iwyv(I0@%x{7_jfqZN$R-qdK98>p3jfr(WfH z)ef$6y*9bdXGDu*#wOa^H^w-Vw*ju?t-Fo}ot4niZSwY@MJdPjpJsOaZ%O+2Td)i-{ zH?_5Q_4Ey(>S$zRR0Ut-#MMoL z%K)WfnUSgPiRnvM$q4U+n1iwW>d}Syu8P3i#vYXDbtCYe#NChsp3)*f9hS^jppK-? z(BJ^C18A^A5Uso0Q4eq56RGXEpqan<-g{!9<_mgWI4}Hyh58JEdeGJg&qBTLWvI({ zb^H3i0`mkmU9BAMaoR_PYr6%o~&=2)tCy+ZYk1$th! z(NCOy%&i$2Z(*n|*)3YIZVx`&%sdc7omod?zbc0MV~p?X;Pw}g;zi^8OF&=6U5#b zFur?Y$$U&bS-}J^e7edc-3u9*6M;#Vq#ENnToJAy1Q~=!WCIfL*U$mEj0CrJ@?K$x zCq8-dZV{J_a9RKP{lEY6=6G8zx2CmsXt2Ajwlo)`0y)X0&nv(w1N9v&KMA3R6COdI z5=IIm5$f3WYr_q z4C_(ZL-I;$nmT$$=2mu&&inQs#J7R#UK?Y5GuPPi+Pp|tb1iMhkc_mX3n%Q6qQEh9 zuu?_dC5Cre0+DFXDLn}pWer_Zo4xM-VUdw10z7t`>q5{`mdD1I(SkH3WR%p6%*>1o zv^CTfRn#x=yaiskgWy{M?+c-7JU4lxrx4md9Y(* zWkp?GSy@<1F}J9+zA&w&F*hx#SRpF=TyfmdGd}iSuAYX+(z8p`VqDz9Om^#~mz1Oz zWoB1o#nu*dmlbncxn*U=*@bNdMFm9}wedy0O=T6ez4|m|RzMJcl{du~jqa`N=-${^RkH)}RUSb6WFvFf+IDFR@yqYg?@RVC zboK})nCD7G<(KB(?8rh&JOPH|3&b_jTaj))+N5jyZ@I565lS35iMSpSG03*mp#TbAZ{W4 z1_t-VmU$NOO=H0?4eku$Cl84c-<3Nu#z#A@bZ>WWhu8_ZE#$1Ex{keaB8-=3R<6Wc zv#G>CX4a8+g9Thg4T&APG8bh=B&u43nEc_>Ns=d|G}vBfeu^uPn?+!U<~z#Y#=N26|Vcq%y z89NjxPf#tjyt0gn##KpDTtcr9hNIwwUO`^X%ERSVls96v@NE6LA%5JGumAA z_YnVNPklLkB}&^PSmuC@e@on9|Fd49?jAvYhk}nE^jFtEL{U~cE-tzTGFGMu>85)^ z3u8>qsAJ}~5LxczSTUHXb@MizmGY~1BzigVhy)dgYImHD-BS{1jKR#;^h zQpraXQ_lt+*yk!qory_|b%~5RYT)RCyQ#GD0u)naRj1}xCKkn)loiFNR8%L#l}2XQ z=M-h-H?+praJdzEuToud@J*KL_c9-634;Y864dtR3EBsE7%GwAP20-`eovZw+>iUI(x^exUFqf_{u?88NqsW zBa8K=r8fs7{k%Mmor*l2TG!b|u+F5$pZ0aUdNsNS`7T6~u}0hdQb%f41fm(YOuO`zg~9pD4AfO&q`ATCnw+2KrG}@M z_4d+zM!h{KxCPc5fOUjbVt-2F#UsO!Q0xmyhUI!7LP$?Vor}G2=7fhUX)^E&@I2z_ z;}@35n-~gymzCfDNzVvph5vYo>vP0v|9^0u_X^irhdNoVx4q2udrM=)7b)9b{1Vsw z;z)ZT%k?&l?hM!47Fe#gjK#c;>*L@$*3qc(=&EPAF4NmR(6u$Yi;kJHw~m?E*Kz#wBn2f5*9Uq@OCh(Rix?z7`Jd1J3^nFkJSh0-A7ZtNtJNn@mdUpTxQ=id zre0+o>bnH+&KTd9snzurG;QJU&tE)SHY0t!&+!ki!>_$~@Q+X4nrNvgt{|xh9gS5* znaS~VoFxobP}muGKvhixTDzI04e-9#<-q&Ob(2eBT%3?jJ$?i-Yvl#1D2_rrTk)nw&V4Q(M6anxm>Z;{>G*I}2Lft9ARfrFnH zWv9P4@UUuR(CN@UR<@?z7Ki;0TI@BYG<1Ee9M#n+70QvT2GC zh_jK);e$tvZFf6SCSJaWbYco}%gU;1!*UxF8cN!VqN+=3siGXpH_$tL_gQPxDED1% z&Ij#m_t;z8?J+R0GD&YvYeHKFx1&0*rZBT5yC%D=s6Ml#q_w=XwHn_#ja8`ywHY0+ zA$#x5EwWP~bSQ%1gF_J$oZd+0_1B<%YyfCS6b;68p#27%Vk0ctZ`@od*(e42;il<= z++I?gSrA9t*B#4NtkO@M38ZdGH}(jxnWi5>K!UA zFRw)CCB$|H?sGGxb(6K<``+UGc%;9#XJBO1h4S&Kex7({zi{T5bHv>E{OAneP6O^s zmoFl^zPa5sBY+fb;t1}+Woa9qFK8F?mGLo;D=Jvoi|1zguSuQnpI^GV za!nP?yEWRC-Fb1orN}omr*Wgt7-T2W^W=J|vJ4*!qz~o1nCw8iz}p%Y1q6?UF>Fsr zPQ7sAs3-aqP)>Nv)7v-jRC-y^^}JHzk^GXL7S0I&xt;CIRTabb@;4#2Pj@pjJ8#>} zKF|!dL%xCMT|BclwemWbuSvht-uC{-AOCIJ)c)rOoXaA(m%Rjc-`GO5Qn7Gv6~X<@ zp^Gfst46Y~eMVgGJa)5svuAxlIIlYHE{1#e@Gvv9%P&rjkf~jyx3fmcvchc#On+$k zx>;^>x%&SLcbtBL?JJMhcCa1iOZT)M-23hyfB4DGnO-s5af#YNciJ)c2*mT=R98d7 z#&R>0<6_RoWt526Ud1g&EWviR?*ZE}EQ9Sy8O8No!&tBP^z^|YIXpOk5&}d`)U;t} z|H03HO_Ukr&(n7#F|?zmrCA!wIjD9)4);?L;koEL~I z*uWn?#}8V@OW+5oeHnh6)%CS!cmMS9Qdd<$Q5#~WyIX3?vXkS`T1~7ou{dIiK1;gE zPe-0U1E(!)o!A1C+omY^{m^znha&YhR2nKf5Kjk09rH&wi3fW?4MoP*+Q!j&KfLa4 zUVcHR&L!mXF8$>1-~97;?@!dGMEJQnSeRK@IXc4yZ>kHi9d>tw2}mnw818c3XK%aD z`&3d++UcWvOq2=dX-TqDC79nMLynPD;GcowzRMPp&pu~+OCv2!qXW@37q3m$o;zf2 zb|kg9yn>q^>}+p>8goW#A!@q;M_NhS)ZXo6PWz?r|M%y=`_ZL_7@7Q0#&`>cJ=IBQ3m8tqk5 zwe@gxIArJJY38D>ucw571qVkPA9oc;o7fXaj;5v^)v>iOSJHNHv~xXTW2>fMXKbk+ zUEh*ho7NbX(NJDB4)0P;@kuJToD&r5xXaM_p94jdmY5)HKvIGc`9l-NmEC>1OS zr9(Ic{|@bwVzgIOR@Y?{v=0xg3`>mgwv)Y+kUfJX`}s=@*~hn$ee#*;r0G$eXlk#{ zX35?wCVR`K7*n}pYA#+J9>9(p1mn-2D22;G)9f($d^ub4x9}Gqi^TqsS1ppHE25%q=WI`EG4J2}WsQ z?G<&H!inK=ntyFks%Hl2V?=XTy>avQKt|oz!dy{)SW$j=pP=7REZx94Q&m=spnH-m z47wxm0DfEn;)7Va2ZQcs&XKs8th5Ueh`JBPQ6ZMUzJU=JLN4d!5xW12{1+tra*OVY zLEGrQ2DtYyaDQhz+*=s9!^F?PeH;$H_SRl8+~4~6uYw$D*vT@x)at$pmhNwh=-$uJyi_{w|Q|ZT~1dGNy zM2?*ZLUNq^DkxE_DRxzgSsbdtm~?Z>+y~{I5^n zn`ka8ZiAkPJIac@)ObY9#>GK)H;y@X4i?GiGttN&zmSlWlA4;56o(=bO!81@gctxR zRL`n~lI~d?s~&?r@~AfuPaonOaHbstY;Ek}eLsBI%@ao9)8`V(r+)Oe`w#y2mv8iz z#-H$Uu{JR_HMeox?PP1Frw)q>;kS&80!%J0ZijZ;+wJiRkHCi1P-%_a9s%(3_z@V! znZy7YM_G_w8K8#(zst^P-#(~4h8oJ6R<4m1L$gDLfi~K@E)n^)4b?fPoHf3q3?xuk zZsB}9m4EXWfBx#um!IC^#d%umYa-nkbSHI%cnCHq6=jF8`14_h4LQh-G}Tw8q_**0 zR|P+zl9HMtMV)bzv@=xWSee>dds?~2?K82{(y~yp-fg~TmyLwJfwroFwxX(>o`i#& zzO}W9+bLUzeZjK6ULN*Z@@i6MHi+5LF*Y}+Vj5vJNyrVWEU&9<%ByOvsX9%?mUDK8 zhI_i4w%6Kq$UxG>$STm<&dAzON8MP{EFh+&xUM{{l-q*eVpUm%sin0I=-}g3l+@SM zbaumsjq{%7SEqOBcLtF`!>m+UzORLHDm%o3`!gJ@5>1AzQ|Thk+g+l;9ki;;C3K$} zB6R0pS%EcDqO9X8k_Wh`lV#?1w24RF=p=LdHo9{z)jenM{;2k$81L=*1n-ymon4~A zy`_O1tm1!0RXf+I#SGqgqQPAt5@lB2U4Bpaz7+pz&(su6@c!P$yPWslXXswu)SjJP zT7z{ep}T0ETAG=Sj#+ZED&T7%6{NGTr@p$e0^47bF~iWkZny)}eO|}-ctwDpw`W9b z%k5iekmA)MLLPL-S~JYm#_H;LJuX)X-4Ej+_40I9ds|_qw`Z+Od~Qji_p0r$(u6ocM=>(U}?i>&T#VBy|zgE2+EIm*J_Tco#d z!F>Vl-=1y0NHCnq9@xBb60;p2Mu?bsJ=^b+&JB^`&fYgMrpQgYKYRR~aQ=}l8ghv; z1Eb2lum180Vh4C+RBz=8+BqG#)ev@?!wyNJA0U}=NpB!xDR8n{M97|)n$N8+%}o;| zp)7>a+ZnJYLJ(1ihcc5>-rP4bIz;#FBFYRTcU(7NtyBD`T`ky zhUV&;x`w7!h^BPe=V+#-sHn5c^<-{KcXfobo~owZ@homtW{|NYU@j@As<-Rl>8gvL z{O#+z_x|y#YxQT{t@YFpcL1#h=`&3IAQ9!2b=}S-$A{S|N~3yKQ;xzJ70IyQl-doA zwKP%xXQ-!1?NV0I(bD87$x)j6I!?!(tPS<_^-QFd6%>@@bo60#SH`bV9ajD$mfD(< zl&ztvqlF&!Z3iqBRkaP3HB1mbqiH~8Batw_I4`WSpsFyh@-)H@E0r=UG$}2oeTEkH z8kDk%0qzx@R87px^%N;ZRZ3=eU_wfMO@4K8Q+j?ubxC3+x2S|$QC5(jm7mQktFA7{ zFD^)X9n$&8nAwT+ViD4bLuNH^Eq|HWodW6CL`cseNG~EtA9xk%1qA7N7}$aI(95qN z{RWUOUY=6*>tRBow2Pt67el>CG_yBURgzv16oX*gZE0;QB2XXaZIBcK9u#%f?!FW1 zoXKnJVEoh8Zy?1KHSw8UDd~sZ3=S(0^~17ZGHO_#@|(JvD!BNG@V70d7v*)dk1r+% z`Ffu&y!O3YOH=)Ab%g0qyD!9?^su#hsgskx1X^@~}>x&(f!qBTfM5$Bv)q z5CQ#bdO|n}#rbcf4}@KyZUg!v0XjKm`pM1G?LgaV`)2 zP$cgQKwlz2fAiL@>tdjH@pb}zY;8epzWWuPD@+f~j`w%sVc7IOLZjMw&h&Z9SIx5G z73%AOeh=A+1n9&j!v@JvBnx;G=+7TN1JKtW1z!#MRi?6#3F;E z)s10&k`zX)kA1V(-y?;9e}W=|Q>Hs;BD^p00MRIje3)s7^(AphNR%OHM@u+vPwi~1 zY@GI^DA4VQPe2I1Q`1^*fA-zIe|~bauPiRq=g=M-OWI7y(#FBb9%1fEatH+zNE^y1 zYMMH`BVf|O%*e+1Anx~-fO~`k;dtSR16D{U zBge7uRf6nntvF37%bWYfBt{=F(b3gGV=R$ywy>_H32VHXik7mfyu7*;rK%vKE++%> zTBsP9n`^15Do9A_8R#e~%F1bJC{VHzD%zTkRx*a#cnyp+^v!);ZEY+qO)Sh*bxhF( zWk7kiRTh>u)}$MrO^wexUX&VNTH2y+V=f_2DOj1An`@}4+1T3A#(Q*(jo^_#n0;u! zq@1$sq4Q{LO^oMe*OgQk*QRH}WK~)S4Kj}#lUH3@Qd*b!D%Lsg@W{pL-OQ(1ocVep z#b8t~A19;wZ$$~f+qgd3&5r5}*PA8IH=Aqn+ERF4owYQN5Rp z>YS-J#8j7`80sp`5LJ9IG7Q&a=E*|~WIh4|i4Ei5R=L%eqSLf)0x?18x@34}y45<6lDYLffrrc;x= z&!tof229|02H6SNiKU%<=8M685|g^00F%0nH@F@k;yRP^4z9N}6~#g;J%th;|6_4H zUf&cM)W4y}g%iTBMO=T27-P1$UNsG_zd`Poe!G-6#}4XmVo;xXmFq+GtyeIpcg(b6 zQ2&eI5`o0o+?q|W56v-PzkN#t_Sz2KwLf43$PrEI zHwV`i)aU0&*%KT8+dVwWYnxx2lbfy?8y;f)kKz-i8WPf(wORbij_T6v4)s5QU5arI z5@+D6VBbIzf$)JAMs;BQ@q_RF_xC@%KGxoh>7tFl(ZT8LqPvBiX5@5<$8Jn2aG9E% zkbuL}ni>}BH7`M(NHB?XygDS9q}1FhUOz^4q|88rp-1(HdXWlRjZuAU@#crvqJ9p0 z3@(`N+`UWRlRy+Cav)JZNJe$~2?xckU^SCTz<7EnfS!ITiI_*o>w;A&rpE)rI}{m^ z{Rw_Fg!eTF@2D|ZHGcl++s{9`GBPwayEr}E(^g+mn3I#mwvz+wYq3%c)#(&P(gb^s zbb*J3gh(*i?{r`~$qze9&h#*{6R;n4Jp{1ZT3g!gIRNzq$uhw>%Z$rxdGojb_~O&| zCTr6p{M`0CJ0kMk+``)4$pHenGSa~0NPZ&(7$Zjn`5tt3u-@nDy4x5BO^RxoS{f>H z((95!DG6Mc(uz`w2m+QB$O#oJl+?8Jj4kb*_wBVc(NdI_*EF$p4?Pob00Ho7@K7EP zKA^cw32uRW(8XIURQ%C!`Ia$RyDcSn|N2Bs{ zOY`dstILmix(6K9m(w;iwlXl*)1~$HY8eVsbbc@8?8yMMd-o7m+JMUGpV|~hy9p-P?LqT>P$gVhF**7-cw_|9p$87*x z?uw5(vcw=my9|c*IvfIs(Z1arvo)~`M22sI^>r*MS0ArFdhvJz^+@i6b_=`Ips-_NXV_j%3Zqi!MCFX)+L{t(Uv}Hds4DW8nHMSA?Hd+_Z>s#b0-4+xz){mQ&-;kA-1T*BJ(9u#E3=a0aDD! zuSn_Nyn1})}||j?PRbgiahvEZnGG^ zFF$|s?dLzbJ~uUUac**`n~&JJBK*cqMw>_M`B=dPVXPMRstL%TCl3;X_)~DVhbXYy zQ*w)n$zsFXoe2>;jH6UXTu3|YJA~i*Sf8Fe9eqAAtLgHOfBo^zv4*TO$J`Gf3DODC z1LnKzogA%<5cP{tby;I+DQS6C1Ka&aTo3HFb@cQ-;%KO;ids8u9c^qm1(Nbm;Bir^ zs;;52TSFZ&F^UKUlR-8wPDu?dY#kh|jCEAy6jU{JEcUqWwL_d9Is~l``T1HauT!#6 z=4G&{#f__>l$^4bk)3zu*iZlY%|HL}!;5X1Cp{cZG@uMgayBIN@NK}R3&WrzrD9^g z7h8Z`TCyC9hKrKO{o528brp5W7%2yoj{Oli8*6PV9poCQLWEb-(a|;5RL8zoSyxM5 z&Q;yqQccUuTut$SgSNiDiiV23rjfRuu92axoPn{nt}Z~XrbQ|2IbRC>EB$;*Sk&3P z@~q6Vl7c*!1Flw1`wb9oU}9uypd+cGXQ*wXt3X+0Jl#m=!iIB3>*~z&j2>O2AD9;x#D^(n*PFA5jFDerMP&2!n^;+U1dWI0c zAe#_>3CT*#EPtJy<*zlb^HjPZL6j5?S2MHxVdVer)ZBZ=SmHmbeY9*@=RGH7Z*(1 zoHDpxugcGWyB)VEtURNPtlz%c+7cqU*LIW%`i1=hq=yUpg}n8ChniL{Z*q#)#pf@K zhgX09`yagZ67xe2@3JtTxmepZHAgS3g860;YUVmFq;;0?`C{n%_yq*xv>PRR#4NFa zj<&>vh55>h6)mk3q{NS6fq&!HSZ{gT)J#j<*`S!DssVaXI3yf21oUyp3Z{@#CahsG zbfLO?i}|~@hWY523yFyN%?I;)Mmh_U5^_9`2Q1{{5N`hRL;5>Z&U|nJ ziDwYq3G$m7*RD%k`|*#zBf~s*YV9+L&o7Z#{&MFl$RDh4LZ+B>Z$Cl)p9Mc=W_iwU z`1Jk10r`te+^=MP_fF)iZfopoDII>}h7>{m#k(W)uw+BCi1@!>VpR8cdR7sNs2j8{ZG6H`j{bp?FqF>`wfQn0*3Y* zXzdn0l)HcD%Rl}6?b#k4-6Gk>M`1@NMFx4O?kd1N@u^}(UWML{G&<=e+S5rwk>)N) z6{LBjr=>ymK)M)y2M{w&Vp4iRZO7pF7(6or2&@=K*c>9e>$z2R?ZfkLe)!{G{^oa| z|CyxDe2cv*eIF%KnC4L^j)@*3JRnX+dI?}3ZW>59G@dKMeTX)s+FJn?t#DE@B0c?L zji4Wn8<;A|U#UQT%nDrbIE30D0cH3@dRh1Bw}1TUTbD0hLQClAU=P0@|FIBK5PxAK zP8ctYlZq$5ZaPJYya9|bkIRn`;-G;?lJ=$W1dx1;)1=DVjacCwtSv1ZTwL7_6Y1tu zGcCnO!-!p=y~129WEGv~+c}b@WxWs0hl#h+}GItDBIXo*H>XNl#tPz{J=D9}fn4CI$vtCPwNi zrW!8EQDK>J@k#Nq8DV+ZiG?|_)fp*fmIq`h6+K0DZ8a5m{1xRCwb7PN=^ZW2PD+SQ zD~#V`XzAz@oqQ%XAv+^C;Y?KY>2vW3u?eX$xux+r=>?G~X{9L{uYC+Qubr63;Ox%F zfb3w&`2VC}8JdJp{1{;Tuc>=u+hZUo6_# zeCx{e0Kb0g3n1Lf-qJj5DzR+@FUWTYcG42|*8#iwaq}LD6bezY>bX->F;QEm9;O0}%u=6Ph zBTbPT_}`wTFVaDRPaw)}^Cf8Q8J}#;&Fu9F&8f<7Z@hf@w-4z%^oVd&_}%uGAanC2 z7~|LBC3xfQS6_mGfBO=2?|ca^u`j^_`w}#CWNi-r#NnxWI*W@-A*R%+rAYh|EU+&@ z{Yx)F*Xn}$+gUy0+^*=oY$Pj)3 zn>kLMww?l%wmzdo&jF2oj}7owF%PZ0LQJ&Q;?XNQ_+g=nNi%g4viwh0==!MbFZnY zZt9u5^6p1J{S^Yp;Ia7%p8)sP?sFbITob(lWcc5B!Ffi&P6Qt&B3}4Z4X*%0_myR| zvpzu(rGQz+QZF`;x+B0NAjP~B^r|HL1_;1^;ff9<{GY#n^NlyIEY8o2547VdDmx8M z&*cPRqB=AFGwesXcNDsU3HwR+zy=e6M|shxgSJK`19IS+7v6NIf6oeb8k;eZbSj8HIl~wl)@q+RAcR$0F}b67#i;nz8+Uu;1>WpP#F(whGFa zG}YDBRKR{x@h3{8F|!a_xSN}q80jN(KvhW|+3$)P29^$vwy6J*2mIA_jZDlf%uNjq zjdwYFhI`vRZ+P*@TelW_%i@CE_gEPqOdkJknEwTm zlr$|PlvXFcA6X@BJ$+q$3riz)G5cx!du%HDR9Z6nx}+&pWv9ayl$@lLsdHd-MPdX$Q()^53+!NH#HMN@5UC^x#w_^2^8)zs56HopSe}v!unvjRSJv?k^)lB}warUSOHMo)`T)(V=mLMMc?(m1$>Vic8~@Q;QRdDsqdmqH{}Hvt9{~f7-=)hrdbw-n@-a ziI8(=@EuS)C;kq2hF$Gy{t9-r+t6Q-TS(A+7%AEv=F_7=*8mz0REi9|7CT-n9d>cr%z58z4TEA0G6R)&xj+fKNYmZp` z!ABq72J(5^kRN$$ucf)^dy6xu{+I{y1wg*i;xsQJrMeGdEkETJrmu z;s4g{c?S6{Ts|x0i-!MS4Kc`X*pB=Gf_#Oy8+y9oI}}?g5oG{bM;sL|>UR2L%fFhX z*&Xe_M?UGbrcl+&xDGd-gPdE~C$@CLN8((hA4y#MEE! z7Ia#YgD5yG;khBmPf1G7EUAOm1LRi&`I&eFl11Y`ow|`GOqUfiUy$gWgnu<9qo}rH z7|}=QbQ&3-7$3pq7rMGpuErZ$xc%Xeenv9M{{D|IzxoE7+I4JdA3j{)9Q|3BjU>{= z7zZfP_|Xi4H%pFK<1x)+IZJ%@fc_f!(7}JG)hANSx4}9NVhQWlmvvX3Kfd#qUw{0; z_ujpI-UzVBok!LM9Dhom1 z%ge*#$c8&ICXrHOV{U3eWFJr8;~^)=M=!utR92D!8PoT$%f9^w4je?{ffEj7q3Ns0 zv9@_BtWGthR19tR9Xhbv@vz^~16Jw^imK{rw2GP%^HCtLq@qS*$jmL#4eM-WX<=b* zVxWzGQC3z#&0v?k!!CUlIay+?SJyE#!J}YgYP;Vj;@DmT8CmRh1qxEAi;_Y=xP`QW znl6&)ea@G4@v1XV`yF&N(^XSeRKU7`q}G$QFd9TK?W;)3VI6B`sAp_qpbm*&o?KdC zyUU!?Zc<;*wq~q%)|gV1vfqOb0tIPGM*47ZqAkZ-nv#{23ei_I*3eR>6x`)>Oeu9! zcPTUd%&hoK2|RO@g1n)Ex|R}o^3=37HT89ME%XdrVp93J+^(LmMqWot`%rVAq^yzZ zuHgcsgr@R7J|#(%5t9@%ial|6$%|sUNdN{oiIk$l0R)N}&J)KN{G0@lW!{tr&Q`O!zO%=(eR zhj$_DcWEx6XKHQ%djAGP{<%@ql}vWmxxrK{aMO49AlYF^>_czPbRKu|jq9V+qce!T z0r*$1=@6CwBEPC{axyI{7)1jmNEk=52|a8w1oAUsH_WLNlVC%P{815Mh_5GM-U9Kk ze{%b<-#fmr*j|6bH@3Ex_hw_`Z-M@M^pJ2^cy~McvqZ!G)c9EK!0XXJyA%DS(4uY| z`u`;O34{^`{ZOMB^s^1FlHAsp(0?kUQe5cQQYc3MEQ|hf{L#Gf8i$j z2S;1`2>O+Q{vK3bBBpugu@q^0+H_nJ_6wUNN$9}q*#8(I!!$y8Nze<)ag;x%>|IWN$g_kuyc@R8(Wq`A{%nS1a4z3;yI;y3?wWweKnqHZ$u(-`^%ousy; zm2Na54o`;vNtvbfHOLo6S4g#(|LZBj)b%t$I+aGJN{E(Snjzk?0{4?PUB%lF* zC&YgyN3@+CF9128qF~a*9stV>;S&W`BZ6gztg|UNG&5Y2~!I1m6TMJ$a8@+S@IMZnOay`Z`iupIUwfP+T2iE zT}h5S1?KjSmKyS~)+ox$qjSX6%-Go6=AhpRAA3z`OY#`}@s$B#2T#FaJO$eNCN>9r zPsW`+8F0kK!9rgHUk;Fl*tY<}5A$P*0hGK281*cz%(NAyz;1-(kfa@wm$3O3oTI3u zviyV~2P*KasijNMQDtQnZ=d59dybp$SCW9UlCq=R42`8@eRm^pXP+-+=1HmT^9nqb zln{Kn^a3SCMa`?psGC?@TA3P|+L&0>7oJ75ViQ*m#V-8XrmikKnmX#+(mU9Pk_%~d z1FEpOoU+hSqNs>L-pBw9Y%S&0+>AUULqu&tXwow=GBniFMZSZ!uDZ5~z817HJ>Bxx zy#@RWn_mE}>EsI_=Je(lfY{Z;egUv=fq*Xyry-BL1nbQBFM0~XTvS{s#CBWrcGX9@Di}8OP<3DE(+qC6QsjkkR>gFBue?2yOj7>9*JOnN5 zL(sm&J_JPhS$R+LecqMcjcFY5ir)eG$)4`AEjJHiyKjKiB8S-SneiWa#GSoEWran| z4qya5-q`rA@FeZr5ADp`RL-GntZ7M!VB$FV*+le$by+8kE|I|EQ zf%QefCAG!5(Z=(MIa582CDqj(9ew?RA>n{(!!#GCqM6*h_R(4L0<0sCQWG!0jjNrN zMWfRhn5!bsrMC|aua6iH58(k|OgymLGa(2}00YDSKnSe@d~RDDC2CK|3HAXCf-)Z|fc(*s}h3Oyk#}zFTF;|?InUa*0f$1MLBIyNN^rw;q0O&eqe+l^PXe7-`6YZZQ-w0Ek zGXEcA=K&Yhoqh3{Vdxz}dKW?L3fQossHi9!8&;4iz4u-R7<$KwVlRm%(PXom&8BR& zCcD{eb~jtI*-avXUCPXR^FR0ZW@wu1|MQRj6IZareBXKJo_lV3vAn&rv$d(Yl}5hE zYc|#~_aE~A=G}KcLZau(zthkc&wv5^yTtWDdIV@;=1bw7XZmpPQ9MbHfKlL|UI9du z)O@Nx_5i@Ih9!RxSHdGeMHzjz9c%(ah`tkw(D0-fLXQGE77+e%!(#w9Odbw=`>(%# z@%vxCclXBm6EK0Yk`X?`^dgdG7s@dHsNoURS<*9L7kY}>F{zE*1_MO$*U}xSRsJjZ zlZmfd?WpXNh;Q`fMd8j2=zEP;TgbtsXUi@dE-bpHQ75@ zn;9YvWbNkVX=j36Eu?_-jV$cJL1!<&fS_gWCK7Z~(veqWdGN3q5m{*)prGEy*>nC9 z|D{MJ%|wXQ#6X`jkl-o6Ytx-6UQdD|dS2TYjR|fZGu%DBX4slYsjnFRKWa3`p8(tZ zwg&nI1n&!rNZA#gkd+a)b=jOFGj@li#B2<5nc?APEs_}T&|YD_d-gJ?1&bpi_Ql8V zk1W8dWqZ3k;i$oM1ChsmJO`!IL=qE`NMBoPb>Pa?2ZIyhg6p!=l9Qv$>s#cxp=UaK z@Y|p1Cqj|hnm`{3o=4Ly4Hs@X7 zxOSZXxhN1e_FiK@IUkg{s`$oWi_X~YzyXz~@p6R=Ax*Mjnia@@>smLez`J8Zw(Z=x_ed#|{#|^h1L#ji0PC+TWDPh% zeI+|5#R2}RN$@`s4)~`K{7>{0deJGtz;Ez&88^t8$RyB2W!uM(E=;FJbaDt|xwxT${u)Lw?(rudiGOz!? z-+=tMCQfP2!3P`wk9a<9TH&C#0Di33KGY*%v!hcK?xY4BZdii%0_F$dI}`dTt%?O) zeB0VZo<1JD_sv&-{^Y~AU%lMh-Gufh)ThSd zG%Vg-!cdiiTZo4a(a!B2G^8N`w03I{E!R>2h^!!*{9^PA^rLWo;XLn|p0gMG`S~tg z1NiUUcMvnr9zM8x+XjD(fAJ3Bx0G9=gK2@Qr9QS>Rd9m5F#Waj_F3jL*V}jf zx`hsK+a)mm_4Mf+H@h8ThQ4A47dH>lOy1LFrpHWlt-(;5>F#7>Ze(C!V(skaV1cBN zwp1*Z8d&mnx=yqF)&wkaG@yh&mCp}}tfYEIrWSaHxX$#X0kNYkvNig^zDi%L3)A0* zb^;9Wx_}>3$JoXh=N>#g-3a?k`-|}87}Na;g-MaAM^n?vsuK1kW@JxgU#%^me^ zDDS8)adqNd>~_ET*;QANe#Xf^{{6ijj?JI_<@ZGn&JKHLM%cY4h@zrncPD@EHnhgCBnQ=oFazCjPh~L~fLGjmI9~ztV zN=nY>a@fog?XGPBj%S+Wc~=Iy`z}+qD+C9FYgm1|2Ibi$L)33?KXtY9^f@ftj$9bM=y2iuneN8Y#Dlvc4u^-QBu5^POgMNvSJu*V z_WZ?5{FULWN~~c`zxnF*`n;IdQ?bF@0g++9d%0 z>haCpYPmld_`P+teV0D{6Zer)4gBBzeqi9AgIF2rkPE;sDVqxX9pl#nD{JIx;J0@( z;5X#l-QM>bLGX_OKY1O1&pOW2!h{H6xrk?uKH|PgE~?{eT`}SMCjtDaaj?ygsll&;;^$*c zj>pE1u|ND+q$1ik4wAo>EoQZKcK6`v+TL6*D=#W6sct!Ys$VeO#ZvRZjVU0FqGa7|%W zF*I*+R(=5vYLuZE2ak-L#EksXs>%`snrmz2RduK*s4uQ7%qy>Q!E`&|-47BMI__xN zk^4tk=I5tUKR*-v&d&l}ot)h&3t!CmX!T9teK}_{s^1%a%slcWRf-aFyP}Z z__)dk@EZaA^wjKeiQn?Sfq#I2zjq?=Pvw6P@WTQ8_zDg1N159{8TeN zjv(@jP_2+rz|Miwh}WpDzExhHUzCNQCprDZd#yVd@&fpI<=JItGkeE?--b+27X7(L zzX1V%qp!QOqvN*r-cw~=XU`GvhcV;rJ9p+}cY7nYG|^evpx@NdbL#AQ>R#Zl3|-~a z`o0HlZb#I%E!(z*>`lY!PM4xvMX;w{TU?Ans8ijgz%~d_T)YVvItAF%*Z}5^8up3M z_ti~3eb-;R{c6zF3tR0*_Byry^`1-x_ z(#fp-&+y~=~AXO>g_IG7f9axXl((T5c{!Uegc0=CX z;J)8{4vi_kJI4CVan`qVwiXiWjTq~jdU6_Madl&%qkO7r6WbNdH?9;s1;nPlucc zPy4oVu3oD_E@zC##w}|u&PGu(7?0ho>_o=+oR=_O|2QEY)<^{ArQ!(8dFMsNB;`~! zV*M7W&h{=)p2a$=LHSbLjD7tlAO7;UzyITx|NQzt$nub{)31xK;p{vFv`5Lmd9IDz z=EH}B!*pnn0-XF)LrQT1-S~w)!Ab&IH45fnQD#Z4=_jClFfEU1kwzALUv@%joqm98by zI|vl%8KS}7-rm+sTdbvTVaq#c+hFLdB~ghdR9+s~vHw^~Kte=jX6T+{u{k*rhcb6( zMC2VizV*oV{RxNm#DsJfBQuKfGjp@EBcf8`agj79ucV^1 zqP!wAyP&wBIIpUqwA$6h)ur)^94BY{s!t1>f3ef~NAK)w*y()j*W27?xVabSyaea3 zR%!Yb#08;*b67UPB;Pgj+u>w^=BhN)i?o?4YwiHg^Kd$f@mz@RU%CXMx1>!Wx**|| z2y0?^D@gc}!Ust1OG-MDn1l}*BYFoUJgwnM&Jpe_ zlq=L-ngn#gwULhlJ-fIX2c-&1CwArJQ?CNm(hIJQQC(w4aZ!9)R$gHdZQyEE-I2)# zkky=5++I}Qn|bc~{&%3?-?)0Zt+pg@9Oq!{>bbDS92`1&dMpz1+)}l|Z@Z8qWr`*DuTSVj4~!-L!Gh`jFiT4W!(;9=_YT3#TXqoL7zE zoE##YhD8tkdhlGi&UyWYO+j0CgzVnWq&sL{SlukpeCzGX>dTk=5$kTo*1?0RUd=?B zzxE-E=(Jv@bpDNVFQ<7K&cte8Zq7TQQSQSE@#`P(1K$n~4Tw)xJtCBs6;4I@RvZh| zpgg}`jqRHc**r|V!5hZ zjAQPPN*?{O8KI~PYz$^p4-Rnm z&HKOo`pe(^=u%hx7|szNYmlHpLD1|h5rhO)a$MB0=+wd@l!!$o<`m?l#lg-#7D2^0 z95ZY50CUhBJ~tg8i3H7;MMlM?71uP=zhzp@Vl;26M@ql2kjl^Q{`5n*HGls5SO5MR zF&$hV>8FA50Jd)#&ADe%q%R+0lB|573&t~?>ppz~>xtE%Ntt_(N0mCJ1F$oot5{U$ z8B{veU&5c6k55B5e?;cZFm8hnJ-YXgPv5yDy2ghKhCIYzFF7A{=05XyU&#|+?nUKz zJGO0HvtkLf{9^d?i!h?aS*eA7t2S&{w`8Uj9C#^ZR>GZix+y?;*_@$ zJay9OM#$lqO_NyJ*zpc3dzGEYma}oeJkoO7G*f+T9TX5R^MO6DjU_6np@qHI;$^Gm zIU3y)nTnYyV+C`^j?P8t^SUEQU#g_GH1;*Nbi&C$cWZM~Gb=ln88~EUh|i$F`vE+e ziThY#u@Sl9yCTve62p(}&B)$&FyrX)!+8mj$2W)U3*PF#H92(mA^+VQcgE~G5RtNW z+5XT~s}rKP96Ff3anH_(j3Wt!M-PV< zptp?yy|Ab+o~E!&qK^T6m`!2Hh5sR-pDWV06N+5L$G9q?@DBs znI)qJdOxLcimPegp0%I-sajQKMEU!i_;}5UK(>1;Z|=@dN??{uCw6Zc(jUlt->}NlDnc3pDy3kapuzl=V3}Y(4k)ioP3-7hugR5Y~j58ALjAaGY~9T_k^J*cngQFS|E1cwb%D07y$%pU8oRHK}H z7-y;{-nwHaLwPg`Ga1S+T)%buwV9@ug}3<$3W_RQZ;0T<%h<@;nX7Ygz=9=f4Ey-RmGy z1qUX%w)+Hkj$a8j+6&frjcH%(p#KouOsfVtAQM0^soaG!sHWOLi&*>@^qgX`} zKrRxdt>ECZN6#6`3G47+aM0W0J_=R-`pHkOo@l5>(1x!6Q4YAly&lS(!Zw%&!Qh8K z1}~L?JU2NCcm4`;)8Y_O5k;sX6&SYi2-|Q`I>@ObSr4$ojER~Po0wCEN*w$;LGf<- z_2OT24K{2GtJ==L_V!Od{1x4Q{nx+0{x5Dw@%L4T++f_Qfw&f4A|5;+)FysE#YrjT zZ?HpUjE!2xZ@?VByMj$vC-58JI0E-Y`E)7R4Z{ZPe)?=^RH+<&4l(|VH!hqxedaXn zS;6NjM=2M(K6#9m$@lC=xPHqfH0!M~6)F>;tKp-Qxxz2-#Hl?T1DxqGdy(H#p9KpR z!DXSnj}Tlc*|l};3U(2e3~}CL+RPblt}ZU_-iwy4Sna>S#Z(9E=0zsjM$QXxx_jy3 zMN56X?X;hw?xs zXs^c=DKTwVAyYYFoAy}j_T5oi5|cJYhegLl#c$u89UikgXV0-6{=uQ!k8a!<8N6>- zz$+WJhi(r$8ag-Rz=2hZB2w4wjR-xkGjz*=viOR9VMii%>`OV8ke7;RUqNYcbzyON zWl`?`>YieqgW0$)$D>FBxBm;q7S!H${G@{ex z-=(Ge=AyH`!^Mw+ZGQZYgJa;EAMbLs=N-ifr7xlPsm6FVLVXk`F3`|>U)cB1`vQ~W z4V}0NNc7Ifu_*bojuDok7hM{b88@eE1bJa`Ujq2u`u+T_OJRaMn0e}Cv0Rg>1$l2} zmAN3u6ANgYRuJTTmGmI^oiwV^<5WFQ1`AR&HJ6Xy!78mrkoV(GRBcm1>{vCi;II^A z#3p1=b%L-yWmMnLiUs$~Tuf1Ek(QG^kcsb9!=osiUw69T-1RM&2;EoDwAYlPKN3qN z)HX)w-n@39D+zM@wyqObI^d}zMKgMF=+g7c!_eQL_BCMp+^O2U#Fmr0)(33Do#g0R zMr{SC?MS%^KpUsM1!%Lv8}jOR;a~_}W64ip(B8IV=brrsk48ktC8lOUf1kK;1JK_7 zQChAB+D%AM0NS4k(0)4sImxr<#@!Us-_qY*YP_XeL0h;P*}YFA}VrS|5q^f7AZYN%aN$Ee+2ax#DfxMG;5q$-p+ zn>L(Ur*4yPYACD_ply7kzPhZux}mnSdD5g59@B)nn~I9RRDM+D}LHnOmYsGXQyKxa9iz9U7Eqhr+8X8TZ)%BY3WF)`6G$5RWa z@&-j_t!+@??X7Ky$W#>N=atlTU%d6!Pd`RKr4W%pLWaMuM`=wuAo5s=a(U?!Qr=1o zEciiYq!76c=odm78owwd^_vm5X#hHz+Y0Kj#CNyDcL%#+!>|u~j+V2br;i5zc&DeS ziEFjTGenLZ;PRr}Y#bm6-O{Q0W^21J^E@W8TEo82e6oXi3o4HFKW7 zY#B@(Zx07keeA~0@SHUd^~K`vMCMw0M&LKnBJjl#d;z|BsY;t;^4l7L8#8;)`Myix z)-PDPanEL-8Ft2u;3|m{w+1KRJMs9&fIzWLuI}@7)l!Jv=fzJMCaf zOm1dvUUF_>t~@v?Dn2DEw=}OPzO1RFs!&#&QC(0`RZ>z=Sdv#*mYS2A85^^2XJ{BE zV}+O!!LzkL_t93TyYIN#+RESGZ1?u-)=O@G5MqySpYE7g@)CSEybRw7FXEdjh)vb_ zu2thZ4TY8R&hO`U(#!a**?v`(i0jh%V4RK|1Gq}V?{igEwgSHsCh!}cYbf}gqUQI= zm_hzhes=)L$0r&pxTKtyGN}mxuyKfkzEF1tF5RkBVkVj59HS?161o=sEHCMpP;*Ou0A?0 z2?&=F!f(HRYx@UjS%mP%IOjbD;Yt4=gx3?o&#E19CcJMF!u#YI6A<34LHJv>gmAs8 zj08b=Yff;RZagYnd?GtMM}AGP!z<(h!Yfbi9Y?shk1@Ohoix9JjWBlEhAo(y%ak~A48K^Fu zfEoqKxu@bM0QoSP;bR~lg;!w@x0o7!2kzhd<{yZ?^tRTJH%=P79(@PYGVF%q;P|6R zBT(#JCB_oWaW9g*l)}6;-1Jk!d^B1V!$s?()`%i6kx@|N(_-MPz!xvCZ$rm0X>ib- zZ?kP~kd@JnYr~1lx8C{S7pS>`mGU2|rX&q67~_C1N_d_c5YADXNk2($0A>n7`RNnY z6CHug@XbXiI3OqGWkkm{#%C~IfN^{lD!Rn@clOigcrO_m{?oP6oI-euGMMz(-=(U} zqlh;iIDF(_=su>!gEj^jzz#>SaXGRrKHOpnJP~fL=bTwHoM+5gv;aq;pvb*2_4Hp8 zuzt--6yP9DZaED>71+{d#=N145jBz_RAPjVc73+-Btg-Emi{ykOiGvg0Ia^VY_y*e z%Q-F71miZhj!IXmhlN!G4vBWGF&P>01`eP(T7K<3=FgpBXJ%q-sI3LAySvysI9VIw zQ6LgO6d6&`4ZLp?QxhWteWk7n80U4IbSc)3Jfp6@iM5NTx0j>UGzb3!3ELJr(tZ>4 zxE3BUQaT|YumWS_UyW53_dMOh2hlm{Pr1qJ-O_Xh_B9Dila!Q~<02hwxUc9kA6 zFJtfS_(OZ6<9BQd^bdlk9&)ycPEg8S9O#Ee|)5)J5u|y37u9c*`q^MF-bAn}CAjhv==20JwM0;wshUXM+ z8BQKm@3fkpt&yQZyDmfE`8o6%h?{#R@w_n|*FxCHv#_`~6+Cb6pp1+1)U(sdGvgbr zfO%;W!CXY!O*HRRHLJDw*{Vv$^3swxHOn#6t*ol5*z4~fn8sKxzbvqP=uO2-wD^4- z<}NNQjZ1)+Qdz02A}@uy42pB&8b{k&`Nha&i(_udt@2fT5gS@0)^hn2ikOX<0?G zmXjB6+jrSH!LAmT#OpUi+V`}`aoYeRx*(8*Al85sAn)J$r zB-af*Lg$_6a)-1so00t0TeoYfXlY3*Z;t5u z%^xt=6unJqTzmzs`=+Pr$5EaIIj%g%_nK5+D96e|S5aZp56?DVB)JF*9DTbe6INor zdlw`h;+29X$G50>LjmP56TmazTmy3?S{_oGMfqq1K(|IpL?C+qci;T;^N-%>Yp<)u z4Q^Ioqhtj(Zj@nXL@&X>75A)TQV8ggQ8@h0fDZqJJe6k*=Eo@C5`{e`V|3TSCyz_R zBe)$HZ*|AsT6-G~KQ+{$w5*`Gs`>QQH{bp6SDy%TPV6wj6;}?3P+KN`gowSiK=P4^ z6jwfG#WmDX^CH6a$vL63PeV}Z6x!z>OJJxdF$tLah-RetU;BStwSP}UDsl;FNw_Pv zf7jN)HU7(d7yJ1KY{u?&2;HGszg7oF5ok!s`|0^CCQZIz-W-1R{8=8(wocwYi#%Mg z;^Xe_;f2QGWy^gr?{ssRZf1hp)|S&O%t2H11e=%`8}Wu(`r2Y-302~0V5XL~fu-l- zB}!5+ri zaCRs^uO(G#sm9|fuLN!1d}Q&VHA_O5XBN!c;l63_*1b0C4rI>obBbHIZb{(kZR?^F zXGiQfuwvVm`RmsOY|;(dwbH?R^-A}3`&Vp8U$ATAuK6BEeEkFFZ9KGc(U!pAoe^pC z0}h65Q?1;(CptDR?$FL->zAz#3102%xBhTs4g%IO`H9C1W8)9+3f;0k{17^3H*Q&R zEP-r&*WTZKc5_SRABtz3{=;AHZpr=q7k~QvlPnu6XNQ2pFG}(W1jp@DHNn%y2|kiE z^a89Oj!`%i^X)V)(vWAAIocotH6uo;GW z{_2&Ay(LW@r8p|G5q@?usz*6Mg+yQGt1j8Wq7)c>~Kwz4D$DlRT9v6mMq~FL{CDH$d^L7v8w^=^wd| z!MIU{m?%Cl_+&u*ZWmEprzSgzD9)o~Qng08mS3a0{&30|#j^y8zjnJppm=kACQ%%L z5n}i?#&9_?TqqCDR5RSX`fPPcNqKisX>Ct4#P7r~;^cE5WU7eqR;Bh-o`KRs*tqG( zGwf5`*jDiWLW?qSn`KjIs)^bGy4^(CLlur{2;}BKZhNo}y7mzhx&vVMzrOgzor|6I zGJ)NydS!!0eFM9wi*u}a_A@OW70b{a0WCfO-NRAOqjfOjBxO!UxG6Mw1Qt_DI$naG8Gqk^ zc9Q7S6X;9xSX!BduQI}VCe;F*_2-OW-*k-M^a4VqI%14Og?&|2*35eJ^x5Da&KzI6 zHY6-II{d&Z+cs~&jqEwt=W(>Ncb&a7U^6Pl0_ncCwm(J7{Wu@V;)QU+&FA6rhnE-a zf7*EZEOvLWap0ZIon1U;&!0b!KHSE_%*4ppL|{BN->zZ z?a1~;PL9^b_$P`BK7kPD3B|m&SgNhm;dE7c5`4VU7`+A-=B7r-v6vc3c#)yay2BAc z4zx-{5*#0e4r8pAj`MqC;3m)Yvv)1_-RqUS)O)_s@}*nWx%&ohUa@EA-nq*c&sjfz z`I>-vD;9g08?Eu!ab(e=WiD%1n$1|@=DmEC+5QEdGyS%Tt(SPMad2C(M$32cmX(`# ztX{Bk=>p#sZWc=d0}k#E+2I!yw0rHsjVpsf4wNJwjEs#r5SkpH86TAq6)Ve4Nz4d7 zmb_$hjIFJMovn>6o`<#;HoUdU${24qw)Rf8wssEoPQ}G9H_T&@5L??8oT7nAzr+Fp-UJy+HSMAV5 z4jY>^0hKX;LxbZCl6tMQs%)3P|N49e@P;eHYCnYmTy}X1!1Z%4$`X%bg>)>SQeIY^ zpUnCO#sVtxrp}_=_!Jo8#Wc-i0EfkYQFR+d3KvI!@>z9-CyOrJJb3%V4}Lls<%h@^ zN2~9KfVF;J zT~&;cWwos8L>t}HuCAgkcni4T`2CnP(G=9UhT|MO6bYwPDmaOfLqXO(Jk7>=t_7as zO+ZD>inMmAV7sIILj|Mx2)lBs1Cb67`5`QsK~tjnSAY8DTbH`w&?EVaZK8TbgL5N0 z&4=?%Wq4=8(UI8b<1kiolOiHvtmLMmJ4_q_9XlIkCH}9$2oAj*U@3J<;%5~`N0%l%q@~EoDX9h zrH!-D)#&DEV>Zog!6G-?X{gb)#qzrAOph7P_BP1&nVACP(B8%>BMZv>fx=dZiRb{F z66j-I-vUBe*T~wPn&s#Dt>3nO4k>Xuou`s&!)qC%xe>egK`@_gV`InJ8`w=ZH)ahm zQal+9%$LSxMQ)hwWMw2#LWUE|l@e{z`BJjP(K87%#@NJ+w-B3K@Y8fHObzuAA=l|RG@wc$@p1FK=n3u8JY^rbz!~T82hmM3CO$deCZ#U0!x#@D>y(<>1-yZ0*G|+#=0-u1{3taqz zHu{GI1Ox^i4hr^NvSioJz@S%N35#n@$}NsbsEbaDO{-*xNJ~eo zH6?m~W{N#>aM%;FcW`j0>Pbf@XM1Z~lxgB$l!>KH^q&7e&i_3YH=Ky`)(JQ-5ac++ zIqiu`F4kahXk0si=OqBVY7)*h_BdanRd6ggnAX2L2j)Dr-D*y|sD_`N`1M?|Msl!3#U^HC)=-AIjJP^#6r@~SR| zoi}gZ=q)o&&#rBjuV1@t>$ae+p{3jj)k)E*q0=s>PGTpsizN@Z>I+RpJaET48v` zb93}BPFV|m5$8NdW6dFk@{b|Q2k=iyg8V4QI$?0WPKAPW4%%Ep@~4ldQvBP0|K-;| zy4(Yb!y)HT2&`zBLAwAHQlV%Q!byq8V~(ff7ZJr1a!}+KgSF7eNDiaTC(+mrC5R(( zsEQIr@)6om@fk%m&FG0}<6B*sGH)Sgyr`h8zN_!nkAC*?uYdQ&-~UO9{5xW};sLf) z8NSg2$)kWlbYIyo0>M>-;s*~^SP7!E$z!bjFfU~y!$)D6NWgFf^_~g39hEZZJ6;Td z55ovcMT0Pu{@9zk)yHR5(5~(4m(HIv+uIY-4QB^Co9UKT_8#;7*oG%`xV9g%feRLL z3uZz+V+V5=7KYee;?Pct(%o9=*Ih$Un%jU+iE9XQ!wuN80O#xmQw zP`}8Y0IDcn)X_7tbaeN??&qG!$X$NcI#}2QhUvnpl7&UInW4hz+UprW+M8i{-_Fq) zKRrBRs0Wgcgh(N*4IDP4WX8bUHq%3FT%{$FJYk=N*McDDrE|$q5jq7-%<&k&qh>m; z>zPB)!?e*xKcxP`eMdIf>gt%_7!!I4a07(mDkRf2n?S4mLk_Q+HQQ(TD(?kb7A#NQ zu+wk-?jxarK?g%NZ`plhf7p?|M_<_=d1Tj~i0C~@d-H3P!nOs@P2DkT`_64Uw;$a7 z3Ljtns_elaLV4wINuwO8z143PL6hV_&v6_vvY>aVvF344K$;jm94!ss^%ku zUe0n__kS2C&gNWEG^cc=j zqBkzjt4o6Y{a05qoHt#aigQ7qUs2o@_th|>mn7Fz#wOK(eT0a`KeoQTRN+nPn<%6h3WHLEPpb6o_Ue!^Ur_Hc#a9FpwCYWKZ~Nu zKJfe^td`HYU#P8?o63QQgO3J8?=gMeo|n0Lg44pSF*%S_sG)gcBMm-ZeeHHj8_`^= zrePw@&yAd)aL9vbe(5ZCPStC1wz`7uFqU=}HcdRkH@@|mpxOHTvhrUQqVjQl{tUxS z75`7>GAX%HsC4BR)S=H6NVBMD-BAm94+wO+<-x&j;o%*#MViM}4-wbK*t7q;@4iO% z@Y=~H+-It-Q!;6;s&|pskqbt`94#*l>12>odORft6Hk^NKc-9f?C=HILss-cT*p3; z7M-N#@DHj;(}+m?fkb}?X>_{F$9LE;%UoVrTu@Y5-+k%zAHVI!CSBe)EOl&sKw#j^0MsAV&s9!^G;<|RHvt;=akD+GSbrek`5e+-n}7oOIUJF z$?+(^)QFPYrsjsmp5~K{g~uw}`gL+r@FL&Ecn@cI*UjtPwrwlQr6%E>rk{lO z$0^T|W)T-&oPhW9Nrd+^LmlFqHIw*WnTkVw@dDq&&w}rr-^cg80^bjU?=c0$ca2;h z=X=&9z87x=-(`&NjaP4x|3Yzc#T_Qsr}AAtKdrfRQmq#ST9^SdcG|;S-qcc;o|l@5 zLU(p}bpqbSKfA4vc~Y>vIjt9gfTw;_G4Ocsp&Ink_WbPC{=(fRvedaX!bLt6X3o;e z#JX$O3G}yG1<=a?`p;m72t&~+pfB$_agBjqLT5CJ4N3s|nx2=AMN>5^pMRYK`eFW$ zFw_5z`>K%Y3d})~YZ27D3WfkgJieLT<{KJftVaS6*1GcH<41#!r$2gtU?4&M-o5|) zje?3TbY-`!3f6?~m zH~pi8bHo#=eG-@YpyZXT?NNoY-vN9pk}h!GAEB301=fq6(fAXuY;2vMB8?zD6}#|H zBuFXJdMj-jsU9sxA_lJjg98s9KmPVNXOefW_VZb~dgG?GOL0z>Npxoi8%qldD+ipi zUa)8pH8J{W`?7&3;^p(_&GGg`&y^co8(YYBV*{JHE4=MY3{6nMC>BYPEWwVCfx)OD zXEcXKqtlTT2kBvgU=oU?ilLD?d>P|uEM&Y<>1JL`2{pK=#rytiBeJ0}=`Jh^(dH*f_kH7NPp<^pYg^RLI?%4Fu%=`& zTCXNZ_o6Krjg}DFwOX&=V%l9;6;j-lzO6CWHR64+%Am3_r#ey7+BKGN!3kE_F_l%C z{m=TAlB|Tpv}~&F!l6EL))iv-FbeS}7e{4$%gXkm>a4ySC3gh0chr{Af87Gw_hP#O zcMH&@yKddul?&Y*9e{QhH}@;;DeY(Et!K|&xG)L@KMJ-R!;rag0U>WuQNs+T|OLUgCHEU0)j-Se{Wqk-;+LHFPwbfl6oGm-ANr#(T& z-wl~S_gVx#7~RiYhm1d6SMd_MSDk>2SA8M+5_C`6cx0UJY+msucrIx zz!T72{IjkHJ&JB=XHk8j8t+0|mt8U7ds_?B@iO@Yymxg##~<&(3M_Nk zv&y@A1iY(yCDq0FLt!IPJ~te1`~8M!RNQ%_}J^s;2J7A8WeXze0KYclS7?8R^nC)wN*9m)gak#M9As+4%we;#zw1pN$vGD)cm^xpmqlUOX2p4A|{qz0%51tPG z;Y#MdjjNXW_%2_!VePVoIIK$S2I8$Ot#I9f5Kn+#vScO>YD3dw^An1mseTY1o(^0O zW5-1+=Qx@}ZJQdxJRt}o2CfJG@&>$-6h4c&1vkwbvr|2~&qTo#oY{k0Vr=IVniRi( zJ30>!?GKti4e4=;8B&ig%`~;N=-ReQx)7AdhoFrSgofP$x5CMZ45ewHywJG|>P=r6 zp0wUxEHyDV)e~biSWS49wyE&p1bF;REUj&Mdp(GGOPuOJTbGs@5O2R^z4tT&R6=^V zJKNx)f%gMMDJ7W4YU~=^W&)Yv7~SH~tF}nWOSDB` zGyVpo#wP-?ITSM@U?T#i4J0CCZGCNR16^JA>BM^Islf{g{l$wsP-FuO3NcH3W_&kY zSX-3oLA?zg3HYIKc?$mwhYIz=_+63e=G<-o}ambYyF;DZ;DVWb>m~Wkm`QnO6m@nAm?|;0E zVZKF;`4J}Jf%%`vE+;a}eFEl7Yx0WJJzW%J6g-;3$tf74x`y_=tT^&$@I)cZ1Mw<_ zO29mMG;SRX^YwQ=`sk;3ul2SQ<}*^5tlm$U#}XY1b5-a}wDOzf2+X_U56H>$r`iwa z)Zk9jg^S#!VJwL9SNUuFb;GL{JM&_8RyWj_ty`_TA^_#hTaH$ZLcsH9M|xe)o;fWP z;{E{TmH5%dDbKEJC#Po@*R-Cx^xB(u?uL9QX!v0stu&J*OM`GTsG&#tLn7f+)6@WAuI2cUenK>6~<$&@$Q8$Wh`DI@c$AmY`O zubxQxc1HPHO&?=cd1ucRCgN4S=2b`Yi73Dxoo(%0s~uXq%8ClhrZi>72Bf(d;U8KjDTYb_5`h8z03!}#;Gyq`N1J+U5Yeg>QyN5t?T0MEsEe{hBQ0I$ZTS`XafkPZ9z3vdmXR66IJIR_p`uDcr?;`I zudTu-qBj5&bG#SW@OB2UT*&!H5FL*aocNRK&e<6rWFrxqSWPpTNO=w)Yp5Q~Qd5^T zZ>xug6a6R{t!kM{Oq}P=u$pE+V}=LZ4_kAwK5z`Kjw8NHRf7Nfg-Y`6;KO$i#VUF9 ztR97U8m%04m>D6Yl|!RRD{De1;|vw$CX?p>pHIpEkzrlY+vV62@s9D<5cJmgDkP$3q zk`V%mejvM)eSvUIrp_jqY zvXvoIIa=KTjy8j%f8c(pRIBBofnhiX;`ciRj@Hy>O;XDyd*bpmckGI@z|k8pL)w}I zwOl(vEnldHT8_&Z<7ioD&!t}FIZ>~wSKQUZBdlatT3Lpr&5747#`jj-YrZ2sV%@GYn~<=}_<*JNhFS(tm4GROECZ?PIobjVF<6C!?0obLyFl#x z#lxWoR%1NvNAmFFI~O|ZYvG3vvmvJ)@f1!8c$%6JmyljmlA9P79+z2=mm0-~iH}8$ zpzvH2rHnQ}DHhxkcqb829Ly0Z^Gx_?imb}Rh1SNmSfm? z6BfzOfA#6-fBx&=|M@ivaM6VL9e+;*o>F=oad<4|^ZkabFN=gQ^e`R5!)hvMIzr)b zuv1AU_!D|Dz&$_uqQHQY3eu_Ech=zjfrpR2xRA1OeZZO(J_{EuS+U%AK4nj!nsF@- zVK%23-g6g1GV@EseoItKjInr+bJfTidLdG1&)eZtj{s6!Z??9vHa9eYD**!=HuoqX zCeq^!M1~3@U1RW(d<99&?87&wkFsS9~Y ziW6x=A}DmS#Wdc^nS$ro^TCNCs9$`gYhbe`1g^ENnZ5mVGkqK&RiT1hBbDi+XA2O; z^$E(zFmHxPjh_g1@o{t7#RhffUg*vBaCfwn7-~cB!+ReS$}gj+R@-S>ZT}AALfzO2 z7%loijHV>V5k}8Xz$ll=Wl7{6z$jCqN!i)Cc!Muq-!&PdKha?HVKFxeqgf229cql8 z!nCjg3u&dr4U;gM7vR4lrJiB5qjdsCNAD=_N`EQ4R5TT%*+sQul~a=nN>~C!DN_sxyAQv}OFGcQzq@++Pr4W^z;e}+FIS+ zm6^IHy`s72^trx^=!%7*Jnhnj-tM~eu#ntxd1GV5>Xlozu3V|JDQJJm>9c2*kfK~K zN;=M~&bjsyMybZ{1&oF>+hGfA2SJcdz$h+7q~{dZww(q>@4glC{TOXaK5^;{riU6q z$}swRjRvE&D}!FZXxjvg4&wD4mh!U!1@gjU7;UJTg3;Z_#|{J)=V&n6C=3rLV)Qk_ zXnYhf+KEMz#w=j;oCc#cJ<4LklCza~A*ZcLA>F4L9)eSug#^*^3i2E#i&36O>;nM( z3bJ$nG3`eHCmaR@%t2Q84TM!*sf)fP1=^@k@F9IhD};0)j%QTiA7UIwY7}Hq4%z}q z_wHfYrT^Y{xEk@rFYaFK!oj+lI=OrlJ+g{=XO<8t!%0%QRhpPlRGgD=Gz`1BxhYYk zMMd zz47Lc-^23FXMYlWW)xEaqTkWa3kap66@&Zz{rD%MCjk``Md7eCS>Ru~_#B3GgsAFn4paw=mF=41tMCgf&E3 zN-18kDJWuU%A4u1{GgE`kCtys22*|WS?gBKHZ!(za&fk|G|&<}2VRRKEvsWdAjR4x zp_rfMV1XmkYE3NFHMK+r+{J6oEa>l<9Zi02o-PL~c7d4koHBXeI53rq>UR4*DIM(zuF?fNh5W%}e@S?RP zKQkpGJFl>?E}w!IoJ{NDCklnY(iz0k^EYn(2rPXIl5`47gYim_UOgT#^dC#6ZZ~lqehT5F^nugY<)+(GxYHDi1AsHOzt*FPB+>)${mbU06z8eEKLX~dO zI#$)&J93r>MMgkVmtJVp{})V!2_4g<<1oE-=k8lO)E@3AUyYFWh@eR?oP{R6ekw)- z)1H&`c3<-uH0h6I8kjaMrCXZ_N^9Qjiy9hA0n-|_CS@>{-F%GySnmU-ZIr~&YOP3{ zEJUUY&BM8&>O}7+vIBu^cZLFvnFwFK!+%M z?>^RNX!TKxqIFQPOsoos#ex(>tKx~2Rg3`551#_Hgkp|O1&1G4KYTR!tIn8>>({PY z?t|`)MGMd#Lbcbti#~4JIJnMQ;N!bwWU1#e>W9KzO?uO}$1O=qOL)H^t0~=1p6=}F z?O|i0uR|#d^sOS}AOS$(;nH>?z4xoIB96W$$|@_hY;<(()<X7NCmpfD~r`{z3>Tj-IIyV)lMM;%4 zu_<{Il5Fe+f2_NMUholhXseCSNy|iyR6#y~ieBr9KxOav=WpE70CkE-%7Ds<%B@?D z>-5_;uUg=RyLxlyEm*jDb881y3R)`54jnsq^uWQ;{Rj3P+7}j6RwZw!uWLBA%0Fo9 z)@?{T?8s;poqOJkBGB`reX8@W=SZ85(G(|)Q9~q5#HLEqm(lbJqv_9uH+-ULHEN02 z8~%keMAP%(YMP$xIhp+;O>1AEX?}er=3zCN!W%xL>DxEIB$5td7G}^1l1{o@W3nqI zXAGqklTq3Ll>QzkbSI%Sb@K$2c9%>}%P|;7E6n-o|3z@g5u%ozQ z!z@!+r+nlvr5+H2IC?Z3$p|3@$74r)5uy??$@x{yNJ2C=Hnq@#IQ9+Mia4&?=au>g z1D*3|-O%3B)Wn1{Q_;0~>nPg<}acS5Ho$G7wCKdDN?FSf)k*l%jpZy9R+-+A^Bi# zW$)@>W$ElS+uMDHhpUzTBZgT8^s5;goRJR2Uy#Q-^kYh<(WL~lX|}H3IDiSg?dk39 z>1JSWX^iYMCQV|DmxQs`%iiWC7yH!6q@6s`meFnE{e{osz89EsG>n!NWAUMJDlqd% zff|tlO)gghbC@LuMiKgj0L4-Cv6fNr^7Y%}e&_`fpeM)uQ1y#^^CSV9iPG9c#!JbW zp4Oqx$SC2d$%XuZVoX64wDE7l!R$MCe zV~nQA#bX6ri57QxR(1Bd>$l!fzsfUOjt2(>TJlVP&f5T5 zhV0(GWz{^0Pr77>F{^V@F=7fb2n9G36;-wMb@H;(#O=PmYd7$Ls*PHkgA?TZxo3ET z=lT>ERDEveU(QMzV!fP|d&mtPQ=V5|yYtrD+tsh}3chNbmDig_Zx~(KKN*!Bf1V^f ztCx}RJPqM_Ry|b8>#hSTWd*N&_!;*rB|~M`n_muSebjKGoAx>M%TuPXa%Xh5<`6(d z@)NUN!K#ru9*L z@U2=9pm>Mv#|NsE;<1!4ZMrF*XhDxbi0WZ&4{yjgip4+IeS*J*9gLwp2KfLJci#;o zCkmC}U7s#y{pOvkCmQR7V*+HD0;G+Ne1l7)P=->BO`VLS_=ME_;)0a$@HntEnXwcr zA?Tk5OW~d>@c;B-njSfP7?*Of9akgEMByLpD$jp&=Wn=^XIbDT-d~Br*$!1f|ZGkfT5|SowJ*V({xik zZRB>T?})>uwStmTSj(mn{0wxJO29dr#YeOAjvox&yK9w`fu5~5a%#Sd=DORO;AXH` zGAvd|Kvr-VU`1$HiD;FMjsjpcHZa1rHbTvIF4VZk&(!j8w$xYB%!sZw4vR6%#}A4P zZ7dJ!DRq$nqqKrpSE6lTI^Eu7CO1cSt~aC*x>j{u?55HEVPw|Cn%(S|qqUojn;yiC zq4nSdw2mY_o1{hc2(1l3Yl%{r*0*V-Xx>Q;S(8e}$od>hU>dTXoJdx&?6yKPXkuVJ zJuXCTsE&WCLz+Qg9f1y&^qw8#D)l!LS3hcN?wicjhuD&9DX5$f%MxDgac4zn0o8!D zp*=VKcoMzZH&qc>Rp9C)1>#vPt~tcjo8QmX&FqjgAK;BkSDUurxC9Pe9on@44n4aR zy_AM`TUPk5Tos=fAB8*9%NK0ef{N@wZOG4E>5Yo>+jaM6_lgO&%D^*o+2$>4K-VL%|-$`UWPd@+?p=TzOwc-V` zwsm)Z4_Qxr4_QN^#!jqMv|mw^wd#aG)|Qu%wPlrttW_x;2=mU9*x|`%e*c*t4g*%jqMC7+aw7~ z7Yb?kt$J!k2T<^`|Lu1~UHFuP$jSm>DmDwk$zk+;4z32%`mwh0>AOhu)>EVxDwfa- z_BJ)tH#9cZla4JWFCaM~9_x5{iHDEGz->*94kyLRMd7$Phu{|%rV2Lzd5_|{A)%L+ zHmqZgc033ICRJS8v_<(NEt01?E<&TERla&`LRhyf_sA=stpol~T$Jb1S+1Dy2icL^6Co!Jx%Fj}H>Cik2zL*NqaOO-8 zTFXP^momC&2*q>>J|_91um{k}Z-E(<_&HQ6?O!nGlLLS`#9CeO{;h2`b4^%cVtDA@ zZ7b~bbggIOEU(Yfr9QKrEe)hv4*_2i!9&0{LDxXv2ohrYLHucjkN69apXeF5_0P%Y1wojH@=y@`=7g@WKveh!2-EAegfpSj7wRpu>rXy zIVA;gNjb&pt~UX>`KjtlDC(&cru&&`R5X!aC`_d|nL>?RRlc({mf-bh`3j=#s?}@OtX;cqT|fX#*A0Z* zpxvppr-#pv;!R%()OuaIc=5u8zCO~i0&ImcPqqj9|ATE!+i3x|>Ub2vwh|;^u>EoG z$PJ?{6Igq5^oIESmyofc`!)V)#fm91w&O(K4ZyacOpvhyN=_j@bptZ?SMt-WF-X5W zd5VnP9yxXdrJ_v@+wPK+0&E)^S6q8R#-3iPfo*;97;HP5l|?Fyqq>UPUf5-uTpBda zT9N1(cu8;kk5zgj-~QqKyKlVv*C7n^NxtH1@>NOOLcQXPIkQof5B~hipWOZFr~iJA zRfvBOsA*C)Ix;*w0$WvuGE5FUrGdC9wH-hH?jL{n<@+Ce^5uW-L-Y}1s78~jAMRsu zcx2EBa`qc!W^bSGz~yCt=lg(cr}1>Ep3h}fgy*q2~U&aubYp)5XfeN-&QUUj&5-qA`hZSO!=Nlypb z^`|fX^p9@`9wO&}ULx#CjG~JlOB5{ez@}IbwhoWM;|Jf~&0RUe z*~Qt;+QtE#w8b7VO?q@VZDS)VS|zZ>cCfXLt(^*s`(j5Y&e7B!r8l-#Xu+pUE7G2$ z5?!&jkp-st(jnxbMnO{4|IorP#HK>zWMDUU#pay{!;kD-W+T$JnT>&%k1rrP$JNRZ z2UVU+@D>6+ijR_xqArd|s;_S}&DeOF^Q?LEIByfw{d>-y=>+5=NgxqFKpu4z?tn^5 z0e~973^2EI^~4?Ax%@nxxx~-ebM$7!vE9=|y%6E*!1L6zGjJ6JqQKxnTTp*_q#C4|Z*AvBc`+R6}m{;Ggbs;wWnqXI&I z+}3ppi* zabD3k+9v@wl@~bm0V=l_7+RqbtWjhIe2-woA^|4)G7Ur3RshFWOkn8k$qdaRhW0Ur z?$9u_>IH^&Fot$aV(3-I&@(S*sP481x;{dM3|bZPE7xEJyn3s<__W#zco{>x#~9ks zK8c~&6YDOLonTvH6Z?85=S%-F<^+gDzf~EGe)Y4yrkd*d(;xQ_tKL-^41RhUt(P_3 zZ~l4cuRy2)VN{`jqE(D)1C?n1<*2X>Cs9>ErpeQx(c%8z-|cO0YVNxA+yBB_WX_`K zp#rbMx=?bY;Go5(4feB2%?n-44GoZi7(dDD`9_b1M$(`4uzs)wQ<#r4u}KMusj)|1 z3EHrEcVtTHaWo=_N9eP7DVsZSVOqGUeH5ny!;bKW^^bs^c;kI2vYL8ty#Drk6qx$UKmPsSdpJ9VH+F4W{~`xf zn?*-q3*#4p#s~NxNHFN2@OWetQk}C@Qn~-5e|~tqyQ%TakN-3{{QT)Nm>nwoE=X8c z^b^3+4hr_cH*ci-I-!rp(!$ctg|eh})2Z}Esbg$piDRl5;iH_#*vLeR-g%2@N=ucM z$#i>n@40hlI@_2V>Ht|Z%QrxbUTTQ?GZS5Ahz^64RIsBIxr(LwmTn9EHv}Jy-0N#= zVB|P!-eLr^mif;2aPo*l%drHzy49OMbGpe&pM_i~+X z443r2h!fwFOxM!ZGq$jC_JFpWGjIO9dBjGvHS2rNnu)FsP-vJlZwS9eO1_bQA_udjsMvcV8-g`%E*rNi1sGxL^-ULJt zR8Wv6D8)wXH8!HLcd@2ClbG0GX6`-bTl?OjsmXi)@Aoo~VLB>noxS$jYa?Y0APF}o zW?KQ0D^~+?y2CkA6z*v5AOd-;tc00*O?YDx|%`850ZoGMT)juTARC z%EwHCNUUn2h1qjwPX81{&Y4fMR&e15$0*0l@n@BQN`gp#oT=nvX5lqJ+ok~x`wAhj@;Hw6knlM?_`29Pb{>`&f zi9QITuyx*g{w3+DSjcBEfelIz=wPzyT8v{UM>LuNNtzs=8Uqb@MFEzodd0w!*TsL` z&h=Zp!fx4`nB%{eNRVZbq=u);R#cb)-~pi9@XmS-ELM6`LS*u7w!mbovRvuyn^$k% zzkYZ)!P|M&DwmjpcWLdlgn}40UHIuWfaKrxf7JT@*B3=M&lT)S+)PcTjnPt+it6-s z8v)KVkcUiuk~*AMIXNz$F=o)$Uw--Rq{R-7_RHZ*Wp*{~?d(wM19oZrYvCe>R32%O zDZ%uz<)STH&X@7!b!_eI?QB=9_6ps&84_$XGVG;zzPUwgl)uC5aYMfOX4p*6xb(b3 zr_R&K_2H8jzy1#Rm0p`57W2*DG~H|R3c50)86c&+C!H0m{g5eF+?3!LA`0{neQ`wFDEjgDw!p>I^RTAe2CKJWdt5^hGcaJAYE8aJ*7 z6X+A6mD;REy=Gm$nJ{C9)r7BF)T!6zGi|TF{rV#-vSV|U;#HvWX!ICN#YmMLv_PJJ z$+RVP^wBG8*0ytZf>)#f!H(1Y^PZn~Y1^c3HIqkZWfiL%VNq+X22ESFCm=?*1S4p8 zXy=X{t9Al%w{O*?UUf4VQUAGVRR+bH6rXXWSiGhTi{GKo|ISg8`~1M-V8Y@JD_1(K zt%SuA`utStmt(O&pI|A4?C z2g2ewT~tZ5Dm72cFW#${cPz<=)m^z@^vYQLH{4UJJOe*+Pr0vJh8{6uYs6p!hK6c| z!*}nxZsnSF?j9aK6~P#(2871#WHdf1qw#_4?VFJDE)Tv|II#`~97{vHW5e{sDOR({ zT5r2z>B^zQZQbhtblRIhhQ87FbOL<+}xF& zc|n1O03q-_RMt=UP#+;JxYUQr9!L-QqpA<@-MxGN!Na1W$4|v){3(A{4G96ypFMr@ z_{rmChJ~3fA(BMk7LjHbM`{_v+9=@?78@Y zKR12$^l{O{2m1T$9=p#U@P`c_6+L?R;L*eT_lj;Gjj@|IXU>cT-dVSPrLiRVt)NE2 zKtPF(Bn?o??7(11PVCQ0OEK)|hFOs9*e#HjMt{8taWqr~ zmsJ=RA$ZzN==Vj>uHC+xu*?mis$O0`+?TC4@%6z~<|%qeo(2!*DR>#Y^p%bgvuIzC?d+)&r`skJ{`NPh2c19* zvUI)r6Y>OJlwveZly2LrMt}T6j%e&TFtB1ZQQbL zyEbjw!Xw+dMdJo7>QPKFNRWI;fs;;7ET+4vDca{x?{$-uVue}y}P!oMIvr5LcP z)~wgGZI{oa&xOyV?)-g~qVjsT8<#aEOjdRDk zy@GH%UKgc{Rz;;4%5b~nV3mT5^i9!Wi8w-sW|HF|-S15xVB5)cVv$(C0g4$ufIAk1zF8yC& zd)7xM=!tR`jdFta3a06+g9V4iolq8a5N!LQs8&wUKM`ziNyP8A0^7SGGNe8Dg=w-} zZz^-F2y!oX9raU-?Kv&hrcg42n%t+!F_Bm z-^cf}eKq#xf|YtW;-VwExdm7 z=B?Xz?%rkhr2G6Hzsv5Z@7}pB-QqXv;^sSd?mm3{_{q~3zy9_suowiPdj5<(RpS=v z=hnae_RI4Z&+Z)F=s3&Ddd?!R9Vc!-d;}(X{NxF(wf^~M_F_0F23%A`6!P%lg9ncv zKe~7A(%BP74}D*7=I6MA*-`K9H^ z1zvG!=?wK8$ILZPf0t$o0zlV5N>L@F(qk!nC(4>+__2HMNKQ%5&dtxy%gxKp&EJ=w zyC-W`+Gh9Z{XXxZwH!9XYs>C}<7dwOaPGp7S8v^Y@bK}|XHTC!d(M8gcmcwELOS^7o5kI;njkEvhy%d>|M@19GrpM(IA(Q|?eZaidB=Y5+K*A)YY4G?$f(dBZME+t1H&4j-z?qrmf-m!bWWM z&q4>&8Vy@^>e0Q|$T`z3n`s1-1|55#>)jiMqAxl&t%=z!*gK0;Yi&br|RxdIX=Tj?AfDx=hh9XqSI%hDFF}sZk!TB3y?IC7Hv9+ovOk(kKkqU z6t`Bj?Z7&kcOq1;SLc5Rby2b0{yU}zDMxWHSI8m}NF~_hYQ*$l1=F{GjOj_0F}<|& zW}wa+oyBLCWBRUAOvgGK`7G|^?!4RqvWR=6-#=jbVI!s|Z3?NhZAodq0n@ti=aA1i~pb0$DN<0DYt@DHG#QVG=K3DgTxWl%Q_l0jY3 z$0fvz)f{2myCj2prYs)kr3UU)K;0{LUS&{E0H`MnBxOWCj7P@B2P>c+4N#Z7;CJxZ z?!P6@m_j4sH2zLLjYA%h7os{U##?{?a!^OeM||A`jN*a65@Cwlk%FPTjEqdS%OZ=C zJack$bM{Etrn@pTGcwXyT8-qb8~s)-nTHXr#m-6Bfa~w?9?r=!%ScVxfvO2!=o;vV z;$WJDY@h_J8aHgQpv@}SH;k3mQWy_4!*V^8TQPBLa|4Wjq-3PV`PeU>KYyWvZ$kdb zAI_frft_RLk;Hk?^uqb`7cQJ<=Nizh=gyt|;lkx>w{G9Y!n|kCpFexXloNl^BlfVx zBia7-^Yf=qAKyH(ZT(7z)oyCwI0H?Lp6 z`qNKWuV24*_1g8Dw{Km){Nt4yH*ekesgPZ2e6jGyA1_`ycQA7C=z(LW*f@r!AO7L| z#Y=^S{E~2yT~c4XaN*tgDi_r_WtDkDuxMrOQ8Ey`jU5w&vE2>(|&-;hJ=vU*kXV zD<+q(T)leD?D~xx_;@#NO1IQE=>aXSgY$0PxccMy^QZDc7mphes1Nw+WI$+IQ{(c>)GEs1=`em+clU8`p=@jSK~4kgRsYmTg)##DWnh-#DOS z#|UJQra0#}kYj{@6FQnytKR~++zqJ=J(`&b*!I!79lU5=5W3l}dHw2i;zt7!jYhJ% z!RR1WI;xw2JS=L~Z`OvjH^Veto7QdGwP)>Wb)W!*ws<<0x|+c5tHW^}gBj>Gnwi2^ zR}WE_ta&y31g%;^si*Fx2}0hRHD%3Ak^1)U$R4uumhG?5yEQvJNn}x3O~Y~BWBWVX z7iE5m50C3U*nA6>#cQRAlPq$@2-+oQgNr&uhW4m!YiVf*9oId*eC$Z`j+UWa2aB+B zT(1D_Zrden?NH5HMCbKf(!8@uvE8Q(+p+Vtg3e+~*q&%SuPfNDGzCoxGSE0N0NK+^ zPwTHKUTkf}croLM+UjNYF6AOieV8iTZS5ekxVgv6(ZF)Xd!++=@Y;}{4xFR|dltam z2l=p$bYQ1ddWfAFHNpUJ?;`uytY_Q6R$=e33JDCJK9JQ3+N06VDTQ_tSlCVh$j;IY z87xDeDFNAqY%vQ6k28DQ%IF?mS!wwvbf@^p)oaVq{jh@W0`ukTA>1lQ_CnpB8kplP zJ+eEeWEu9TG9Tj1j^Q-r%$|cY`=-G-vtu1L*@TV4w|r(#b(c+ZU~*;%u~kv%p(C<3XUJj2*k|D z@>O2pnctuK;oSLi>}*w>*yTqR7XHXC^DFAhg_op@{8Ej=OJELAz!`w_xpQhz20P#7 z!X>;OUKZSO_8iFO;`y_ujvU&X7Une1YWfuGrCyt}51lx9^7xVOCA9zf_vR=?4(!{T zmzU4>n&#)_?AeV>CjpmsnJEb|Q9<@&x_9c_r6ZR6b?MfrP4h!q4l)G#6PxC)svTN!`XqUJ48(4DSCnIB8r8MvKwlc zRj<R07~d}A zzeD`UGOsdi!kz-FNohiGP^l_&=zoFuZ3OXIA3^-qk0CyV`UwR6&VxYRF>J*7jSFvrmaLSXYWKIEQZt4e;^u zULUw&+tDZN-JS1~lecYF$83zE^|LjwV-IN!L0It-=(Tn=TUCPs8$5meU?B3snrP9L zty8;}dYuB&eU^j&u?0U}|@~tx9 z<1CF;uGb0=rNsnb(!@7$-?4+qk^cUn8@FW^oHz@B{sFLUIL|Ne^Xdy1FG`nG7tTpP z@bhL=51he~n;lo5IC)As%};eX4K6r;?(C@(;JM=`PoFsr#b|F{*7gWb%)?k)&9(Q9 z-?Ja0*}h!1TaBVi+EaITR%S*TQl=n-QDKE&rX;ql-PX-9VSZjN3r2LORQjgPp;9BA zr%|06)d9`2pkAvEt7~4r5dv@;AaK&Wc`IbRcAzo9HgyptFGm~KtyiDS&xmD|9VPWF zs$ts)CC(cY%i!$8@%nR2)FJ&*r7^EwrxB7XTQmnA)6u zNH8=5+;zfx!2sPInhiFNV5p_4Ir*&{z)9GovDAn+=8bAJkmG%nTnV-69=L#0ZYJy_`wv9gJh zfzcC}&+oR--g%6CfM;lvmLK4^lpo-|eH>)HU2c>b5AeYT^hp(0G_;x3aq;J)LN;2s@A2l%Lp;O^lV;A{(RU0&`%o<3QdS!ZWQ z`M_nCm59g~ueD@ZadQuHqlAg#O2{7Q9DeEGDdqHD8QCXKpwqizu}wX6XgCVfIVerD#T0%g;t*_Kxmf$?0mPF&2fNlPycLX&x%o;DL=liAkT_? zd@sdzTEmB?tZXA(YDa6Ef;K9O``7{n+kLn%yuP14yvL>zvOoIp@V;-vP<+x#hj$s- z(;Q~MEIYgx1mF8Z{Y$!>8fhA~x-zh92G4fzRI-6J0j0p653z!P-7_K}`zM{c#Hh9( zh=ee+e`Jgz%pg1=Ha;*;2KEgx5{~XjmcW99fKqRCxiEtOcKD;qCZhfQ%aPqg7&&!` z3-hk&2N}+nDkw~NpxwdZs#5b1$_k)8o?+gQ#Ws~k<2K?<9ufo*Eiz&6t@rHj+eb5# zwruW%HY1c5+SG)Q2=wSf0=-~ihD+IM%8Z4W&GUi@$$g#68p*}fd5yEP%R1)Tj3xoF zr9CJ#0&#bnV>TruCZ{Ct*tsje;K&gXdOttP=@5U+?C6ohB>5j?2l&A{2lnsVUvOym zCNC$4RV(JscG+=F^Q7qBUG{)IZ1V_0`s1fR|NIny|M1rJE0@llI(hcTYd7zZa04yp z=@a%?ED|6`7e6+~asJ_bDEPP8tuJoh0cPL5cmL+msFibVW=XD?o;o;@}cnSvnh+@fmkjtPMN#&z+UaGl-kr6@iii(5CY zUH$3GkCzHB-?)ACM1tF5o0*fxPqd59DcF;;bz4gI!IP&>pFML5|91{z6rue2^ZE@#E-usE-~yE*v);>xw6wK6T<48XV{k96fsE`-A(kccpF#^>A2Z zGi~hfF*aVwyY@g%+nojdQowm=7-74tnx!OfPuvoZ;ut|s8>7NQ{M=Wsm^X+9&K=uAHm_z;y_S6R#$+^{(rA++&$3QkQ{a8$X0625LQ96VeiUw8uWtQX7Ur^H zu!@D8Ta4_9>a<3%ra2TF8imooOO41M4PuY6o)yU%tUjWSYsxkm*k_cCdsx650EkENoHB6uRNFaLi>xMC75-83@Yg5TpX%Q3 znYa4VUsu^*w3_0^xu=Y!(Kam z={Ek$gBQiGOI|-)+w0)(4PXE9;@O)&pZ@h{(XS=Nuin0Y5je~3@n26chd@gRUW&hK z{`mWEC5HvQex#XV_TGR58nZuM{_*BL@>)L3D}EQDiv3smA(PHqM+TG5r|Czv=~Mg@ zUx9x-R{azI{Egt^5BMj$GXHE`_YeH@9q~_cNt7NP-<>*RccA0|6&D}#kHtFAa0gp? z`zy5u6#YoaEiN=HjeR5%S^{hr+a;pt)ywSDfm(Ae5l*If4NLP+bbwXGWle<&h{npc?t8O z>Ijj~?-?@rXd;}yF~%D4fzlvxpnBE{BlqwC6%`efw3%b%p3vY*+!I0EV;clUpoGcD z4VyLx##Z1Sc*D$Ojes2V8~=4ET9%BiQ8pdDnj(g%7DOkKfY8=_dW=|%`gn>S1G zQi8CBC9o~#h-0R@Vp9x@t%tk|c*3JLChom>|HWT_6kW*K9&Z*$PzIm46xJF;iW?$> z*4Rv*IC0X1A^rMKTfEB6!yU&Iy12Qmb79W4UDmF{1R8mS{Q^THH^pyb+v{R0L1q>T zDoh$4KY8lZN%UGJ9IV+fi{mFCYNMBY=ny+x=g`3e2fsg<?Xg}0?N|O+qW-fyG$K1WyY9(pZ8n5>BxzK`~!zi zoI$t4a8WO}7la?B%jzEsFR=?2=c#xA!O_nyoMfkjljbLmA3t{d#EDa<*%^Mi`N?BP zkAQ=YQ=cJkPiCUmyh#(Sri||2>)XZKvRST%ddU*bXMC3izZ&UMT0hiAa*iSrwGmRX zF*3y4dC9aPy}Gn%(E{`7UEvn*&=LbdSXT(C2QhLut7COH#3Rg>W8}S|21`?$vF0_K zG{h1?3> zIu__aRnhx}pQs2FCA;joN>bNCae-bkLi!cAk%ltql}#*=qbl&u(4_R#})-kSP(oZlItHQJfuFluK+=K$NVzjd=Bfwbe1TB+m9g5N`uXR2kn>|5g zwT_1u)jF!pL^e5j#$rclL`Q9|KsIaLGSRJw$f8EHQtWI^QHq_vF#@XhQQ5hd7dzG- zRP1a>F}5o#y1@g26@E`5umo zxSMBplpQPoSK66Iqf@l1)&(_>LOWyk6Yczt*fGlWF0Xkeq;E@t#|X6J<+C9Hw6nVs z?PP&=4pycef@hg_b_Z6VokPKQ|4?Nl{JBL;(1f`T8l)_{QnsPgn7P8EG~YR3TdKl3 z`Dt>+;~gAQk##P{%B-`t0_y}t$gHzJK~nrhKCvE~H!2Cw3hO}1l5^>4_}-~>`2Iyisz7NMTjNF^d@$9nCiCV)!OgNLaBk8(DOtC@h*nHv{ERbZpY@ z1BVWsyLjf{&iEL!=%`4{Zia^%f*T^0WWD{=VS@$^=-;<@zbOkH*SZqFFn8u*=C;;( z%^GKywQOB82%%oS0U;65vGIt6A&X}Eu55(4>^ty197<;2qqZSOlSGas>5zsDORS*I z!F_x8?#qw0oiKXpvOdb#9W(6EMaMgec&{DVuoeOdnd(L4~ zHG#e8mtUlxtH=hUCy(_-`o|ny>ADZ@+`n}?ZiZ#Ae*JrOZ1uI{?(28hJ##G1dj9y~ zJt~IG@1PJuzvIah_Ow3stblajP?9Z5;H(GtiFNp0>7MSsDReIMG1yIZt0{_~>o=~R z+P+{w@4-X+ecqsg1bOo&mBqRzy8m@3$6AGnE{G#SOI_}aB z;yI4?Hao}93usZOQ2r3>oN966=)rw?J3XfK|8~gWZ?#>%m>r+BcmKgdhYC;y?uGB0 z@2v$h6MSOi=gQ1Pse`3KpCxUL4fk2Ibk>*weR|5)9b^dg?B1y@g8f>yriHf6n>46f z8|;AvTTPm3h+0^E)<6SBs7Jkr+Nf>nK&`4rDbI~Dp4yzXs6sjvZe%qvy9%Z;dyllL z*5*~K*Q(b5FG3sDu{FIukqcEbP_JnB5!xTM(QZJD00m!FHHTwKz|<-hQpvVarZz*i zikwNUt8HF~(gneFO^KbbzqfWRtWF2dz~%G;G$W}ksF@AR6NpBtQcEEz3?Lx8mD(g2 z1jB_qNm#5>x|(Iily=QJf8Fb=t^@n`89HF@8;)_jlK1?#ppiokKJ~WjVVMS+Fl=tu zqg|JV?HaeUYF@KZ&tBSb!@uh*Oz`;Dp;;H}1yV}26|jN^Wr&XNBH@PPksm6=#Z#}DL4#R(^v|AScZ$vP?fSQh>SQzUI=zftFkHl zg{z#7>nn26JI=L2fy6a0wAz>NxY|yeByqD6OYJp&)~Q6t)kRBivaRr#zv(63e#l_^ z${5U^7;GjOj2p!|#T)ykyjsdJ5|}-V`rh_LU~xoX!5}cnS?{7Y64)mELQ}h)mhd`x z%LJBEN?@w(TlMZbk77?Ff7$;te?>Z%@s}5gb%+C1#u^q9f2DoEUo?ZO$%u%Ff>>9H zzkD2hgO`_X;+4g^vH{$(IIj9(5i#B_WTe8G*H!7nR3NbSAh3-A&S5biupf@^-<22> zEO*;&D-oD9LPW(R6PP^FQ0}CHShOKZ*6S$g3VmLZ>sXoq{$gmfOIctr@K-Uot5f!W zqb?iBbstqs<<#X_MqT-zrmp4X)a4ucF?D5vx(aN|Dkk{ax0F#=4yfxV>9SHW$<&pp zP*;Te^2*d@ZC|$HC18V*y7npsleb@G>MD?_YguV{Aqu9TP=&feL}Q=laFnZGLWlqewiYrD`&K^N*#(;1T36=A z-K)5|V6E!vH3sLFvSAJlH!@YAFOQ!^(Pi=Xyb~9OKp>vVcH#o>DNCylOBagbovA4i zc2mcWA3tvNh^bE7O$&~lIC1)ncv?Eu38rUTrY)1S%KiBg71vKkV9orK!?dvc5SoZ$B$1sP)V|e1Zi$7kueCdMWyc*AE zFidIab?O&hzVg#$^taLDhGs|C;GrrxZ@9oNatLeZ&@LCCtEtYMVkes%%iB2f+g|

gu^*O#_3F{B&+Mp_>^xX@_kpBxa>QJoqrukdEVip3`P?v+ z4i_6j8j#qqA;`;l#bWF6!w2^Nx({-=kUra6+oNlzPF=bq{|?Em?XW-rL_~W+YGEl2 z1UR|-0`06peOAxBE=r;LjheM;Bet#A4!!pF?b@_#+OQ6}r?64d!u&0QxT<3JLGAht zo1p#PT;EJ+F129I)h%1Mk=oX416rgN#4z1b%Y=k7Sf(hEi>Vqa6%mxQDj*kyt%#}^ zYP2dueQ2t)mb?XTUXM11(cUrY+slo6S;Ir?MGXZH0bd4r7cqs5Q#|`r8ShxO}ZKE4lwChyM_6rlCuF!3yRXV?Wrbd-7>olvn z<1dDlI)5{M?|Df>%t&J4$LSVLP9$u-`RwP{{OrtM5Lm}hGU+9Zwu_R%6c-G*W1>*3 ziLbbB5Oq3H(qX2PSFy7$EL^9}|Bb6l2BdyWXigxs>{3D-3qm`q1)=3zz6PNcYKvq- zD}Bss`87Ubw5+h(FpwdP*ITa1rj9p^djs>>b-O?1Sr3KJ-a8pqsj`qJNzEsj&m42X zXWL@IXCb?ce5TmPHpI((<|gx*T~ss@CF0&~(-|Z_mnHHlMgGUE#7cUD>Dyaal-Al$fO1UTz(G6KJs|D9UY_lRKg%OO-z| z1uwT-s;|9dTWE9#y=oH z{%DBr2s8(6B9|AmSrTdj#3auXEzt(=qg87S<+pYA7Fo~vy7mF1(iLp|gYID4p zz%iH1A`>j~s(^y=e!vO;q5J~U{x?l zO+Emzu?3VsxC2m6wPvkMTDNW6t}Sa*3w0bkxG35veGQv2^(rO@R?3|s^TsHPC=p#= z_tOA7B}hb+UxeXBs>20V%2w!MA)?a61ZjNA>SQ%MXKLty5?+vY2gyr0nVIs5h^eGH zCbent8Z%R2c7)gpt^ze|$Yo{MAN@M?(zff+q>HxCm;EL``IY~eb!b7Www+t3G-g86 z1kRr?xArX1_WGKn+v>IE_^7W%ZLhnB2Lud4^-nfmq&ljdEf4|pvQkxED)fSw6 zXDH_EFA?>V9%UDZPw(Hk*REq-_nf`>bIC4SNPTaA;v7<+8kB_Z>=;*vXmsBRvJ5NZ6V_tr?J{=fAEU;J^iqlN-t356V(ilO7M50C2wxBo9zSMiT*FVV;I4Qe@;HOsR-S~90~%AXkDC~%|X=@ z+D#SIzf#)apdENDcXPOO-hpyDCs2$n+Ca1*m|H3BWg2x-Hc2p(<{1}X?a|O@H^8rDYOI+QiX&XLIga|3^_>D2a9A;EKW;_H3(g@T?RwHZ^#CQy>-$CeS{d! zBKQU~O0z>oD84Zv7YIIx6w0ufNeokk;dSt#@#Er;LJDb3e@G#%Imyjj*W zXU$!-!qs~{EPyZovUL_HaB;ue+BL8Taxi(lHLI~(VuhV8!tRzVT7Wds*|V%At143` zPr~r$1U9}pyhS5NjTt*`?3hu*k-=a(Z0L}|g9f!9gt@{21Nwja%{TpV?Hj}|_Qsy( zUSECPf4~4_*yH*aJwKDWs=IV(OSDi0VjZMBGLbbjG%zFmkEn;CxZy2Kh=1C!w!EFt zo^_Dg*P_`z8U+E9kRPJ1SclhDV~(Y|+*X3Wfn3Az60=&oc6F$Y#6mI+p{=FHnr4Y! zmi8@EF$ZUyRNDj@PPOUrHB~jL>8h%c=PZI+lp;yq?7?fRQR=aJ`Ud9omUwinTKZZ- zZK-Z)mgnExDn{G2YnRp?z8w8ozo|CJ<{K%PHfUJCeYfGhms7e-Jj>sn+4#q8p~Jw= zJv*w~cJK4ethtkG^xu6WKDdUxPya@|TWIWejUF{(_;B3_<8aQLd9u3?+f$73 zCnO`Gzc2HhA{M5xbah51c`HD7N{uDuN;v{9T}UYTN6uUGzj9tWxhzI!FJE5Hd7KxO zRavE+mk2d5Fo&wFV3_<4VM2$hti*J=${G?=#(A`OB`!8OgE()0$o8}fvY}$MkXv4U zp&yXm^yOvyqXHZ@8c8pONH54aIEy@f1*N2ywQg`3=>>%)_!H@w><|n~6M8DQ>P7kHN~#bV2t`+WbDw0=7)J#}FzKC&8jo1%Y|E2a}g(cno<3 z@#3njTcm_nuy1g92F>vJEqDZO7w|2M)yIjk)lgHxBTjblxLExrHC}^06WbyrNcbFj z*gkl?8Qn>)4{2i!)E{WiQ8Itr=GbT!soDVIQ$>UCR8i>J@lDn6fyg6*cHPE}CCH`{ z;9g|08ab_MqYy1^ya znljV5gU(3l_eR!=Im%PY@?5=&ISDHzN7YJ4<{&t-mCV6pg}t4foQkFTZV6k=mY85W z!NLW60bkg3!MyqNY!IQ1_}5u8XU?#iKFw-|^~{;p(eHvU)Qf+~wXBy(Z!BExC22Lipf574Xc77{OG97&mDIAR~DHpRN(dKcE2cM>{FU4+i8 zlPT@c!V;~vrV25N&3N-#El9I$(*{Kw36mW<8ai;iR27tls13WaE&?tRUX*pOz+lg3 zcJI^?frwq(ww+=BibvP}?2C40OCPbfK5!>(^TUm-(PGt!2U4 z$(FB)OA559g~e*}rW1#$Bex)6u>_;0!q!S8_MJjv*8f0aO(?+IYegjz z^PdG0v(GMuPq384$hlEQVkX+e}cw#9VHsum$^+A3|Dx7~+$5 zMYJV6bV+%GP!TILQo#kd|bb!CZo~uINi zHS=A1_|15hF1vOX$z_z}0u2qaZDyvJq286fo70fuE+LcLoAeA7B?}00zsiti3Q=s= zu1qPN8dxTHS{lA;NcWY^H%P_gihmk{8cY8@1H%Uyrs?Hwff25NR5|+c z=Qh5TZ(&el8AjOoBw?~RMK_gCVUvYPhKcG4E1L^+7HD80Y3 zWM7+G_U&u=HKO{zVg2fSP2b?VZw4rV(?feQ!miyjR}JVKvJ;$N}Dv)lD_j;>#``)b=EJ-_YTvu%y$BS*9_>vqD~MA-SB z$Vaz+7|-(QEbRZ`)&2I_&kVX(jHCDhXBnjT^S*S9aa((I$Ku#Hua0B(rtx=RGE`mf zxqzyRB0mu}ifv82#Go@X=;AP!sQ2m^1s84g)U*0+&)$C~^{-p`i%j&RgK^5vS znZi7cbr^{(IQ02hgThvnQJ6ADTZzIp5|i}QZa_U0fnt#|5hM^Dc#q~#n?id zSyq!Lj2$@)i_uG4UZAoWvrz>?fOPfwCD8*P9$`nO_G*Vf5PI0zLRzb+ttsih%TD)A1xqZN8W>c3cYt>kwI>2><8Ju|F zvLxAn7`FD%1ewg(k9ul)1#T@TGe^IKtwu7Fj7_hqKASx^$0{MgWfCNv_$%-Jsl;U% zXG=9lt0tW~J#=Wmk%8}#a(J!*7oI2Ni+NN4Tj0-pS9)3otm#rN%VYVfJSvT0rjhno z$g*i3(!1ngXH_;19c?iZoR1;>{JcHc$kD;yCGiseT5&ZSkKcp;*lrkdvUHgyxG5X2 zgLlp@MjnQgWk#ho&4RLYT}E|W%gChaoBmDUBW9Z5S{C?Lm4!0hkZr(K5#%Pfn^Fbz zz|^pWP!G(oqq@v)XfdJ3l$@g5X(F>E9+?4SP#Wd(OKB23BW8FryyeamDVgukfeK9( z2NAOS<)#=*#*#w`FRj{{s!txb@LIs(myO9Z42c ztzs2CuF$vvnMIL=jCnWIf#GT@1xe}*rfR%OzE|%;V|d=H`lm&&AoW znxjcsWzFi1-OCuAVj>UsY45NRv&cOrA1r+H?l$ z6s+{qYfgg`c{CM ztMO~T#pJVAt=rWeGJ0rp3!!c2R$bff;IBm3`anOZ@Sgv0V00U}PI_oNwugAwSG{gX zmt9@HIKaAIg0yqvi)DBKnd%APo)88NyN}#%q{B<$k-)nTxwz!#>cF)|D=HGVo ziti3Q(?LKieosvH4)pR)FXDTh2(uxp1!}`H4G{?-A(SIW|hjKF0IlTU$9$T>vaJ|P!W^f+h z-;T~jlVs#FQV>?TD_k~w=SN&tYDEN>O$C>!Cr&8mvc&(!W$UfLWsWkJsnYYx-5YvE zRHR=XO>`wTb8!n^VO!QmLry2y%zfo@NAl7uIh}RG!lNU6zO%>r4x<$@?MekU+v<@X z_%WN=C^mYdtoRvCZB4_9PUP<>X>Mii4PzIL00d-4z>*0`k&uMvQFv?{)ns9=AJEtqBaLBJ%C|C&$$=2@ zo{@2~rWlBJmQs_+>B`2nN=8kwoW{%rA~5=6ma;%T(jHSHpS^oaV8|Bs84mFMNZQ=X zaH)f^%IrP4`TGwXfNvY|JBJHY2lh#ORe3pVw~)hfEpqnc?mu+w=%M}jQf_0g)NT+J zB0%%<_Z=vp0oQ^9d*SeAIc$%#yWyT3a5Y7OB9KNle&g}k#7X)+7I+r@1w%D9P~DYj zDwl*H5WYjT15giJ##WAt8U#>+!4tMkjp9qfSGtbdAy%UDfk-KC;*cH%h=LmGYl-0k z)IK3t3{g?nunO&SMmI}DU(N(Y4>h}lP!bjK9qtf=%~1;}Z8#~w;Ljifs;Dc-gQ+tp z1*rV-XDomtI9i8q(J0iR>lhS7{W)|1S!fNp83-LQ5N$kkE2*7`$BOv7QTh9^^=cdu zS+FTOd2+Ln?o%TrNm|c+Ybs{q0DnB&57MOQuZG^j{LrHGvp_@82W>Zqkp@o=C9*#3 zPyY0)>IIk0dZa9Qc|ew7UV2ZJC#EX}Txx^5*1Ed7xvq6~#^@YShppkxH3@v2R)WP= zK(Vy7WA@?-W^X~2+;>R&UxEdze2KIe7kuSJXNz@^#tdc+f`a79tZU4eK6T3E$y2~vRuDni zOf}tYRUe}0lu5LEZN#WiqsL8{G-V1NCQY%JOb?zidD6u3Y@EsXiBqOoi8BOiZf!bq z7T$8UG^d>Hn*PPpoA&C~=CgM5d$j4+wn4oPZ3Yj%AxZ`jy)3X@PgZRBV|dHfHLXAI z)o#F8?SM`bZq;ZLv!LOhT*8Kdzu%M;2{rkD;)m6)->QG|FR$NIX$EWL8$EX!xNuWu z=F-f4v4i&e_guEfBXKuq4o^errq-2kVmbpVI))A!r(L@6UNUZmx=shS(<^Le3ReeT zVkf=kC5>LAi-x)m)Ps(gT*xg!Ay-mZ6#^j&G~7;woVilS6>85)uSHHAR$yu8PbBz4 zn@u;NhQssiY^Z4asD^7*;qfo&RjG!1sijXrZ=ie<4Sf=oHt9q45w#m_zfyT57{;P@ zTeX(x?z-I{_V18Q{Q=!MI1t@!hl7M_H_EvK+3gNc3OAYTLOfkDM&tc$e0Zh8ZJVLY zcMq}~gEiRdiBqSQ6>i&oDi>}TC0nUzk8NH~>sLsA@f zrtQkzw}0=RT~bD4S-nK5gk;pTj9t6)4;QupO>(d8<_acoc5zvYDFGBTYh4V^Di>`0U~2{WBCRvU z2*H{)tEDx3HDAS@*h+&VcMw)E2j)m^E{?CjK7 zD;*sj937iAWkgmIn5qgb0>?vzCE_CW zg82)ig#tQnY$01zi|Q{d5yK)zx-xf;2vt%ud(PaspbQcyX9}prxU~pQ(#@pWY{m?O zm0^Yn%Bb114YS0V8f#K8XK*WFxXTPC)xUG?*kT_&hp z4mbELsEX4w=wYZmJXU z8s`nHL06yRwMKZQvS%3EYMeW1{TZ)Glvm;7sI=K15!)R&@ym#fuTpqT@!@~SYd*wl z5tVr@yCSbeDZFMGM!dG6tf`h!iPy%;yf&?z*OLAlulY;?udOL9;y%r5*_C+B%fT*c8nzZ!9zNT6pB3r&C$qfTOmr8^4hE!vIar!5cnZS_6DpfSNFwe3(XJ z^N-x35ZmgC#3u14O!Gex8>R%wgg?Z&GO@+&NY6xDif3smYLZvdAN;|7S0yDV%;x_A zv(>vEpKns7Ma=HD=?cXU8c4TRM05_-Om2;iY^(NEPALtjm+ll=NXis zD3eM_XEaB;B2Bk^FuI)BOa#;ns1nQ(?-v|Q3%?PgEqnZg2ptR&Vw4)jK(d01kpkR* zJgh4Gt5KBJ1#PS<8bs(0;r};mkRmOxB0PH2<^-(sGI}-YQojfWLmXZzS`wUT32r&F$SfwpMb{I};(9V;aW6VTFU^O6F(^7a_QWEi(ff*rR+|CM^|~ ziA$?|2O3dVTuVo|5m2BPvqxoEJ!{;fgo*G3@@k};Ln5~Dx$58aB ztbymm6&5pzKOoD^u+mKzPyul(^XWkTsa9AdMyem1W{MJM`t)fvrV&+4p+y)dcBZmv z0(gQ=QB9sCO=OeIa2wiZ)IU>?A2&`MFQ8*)7{kXhd}ZVKSP2*XI1#r9<4W)--FRVw ze!K=|$}wi6(ODZaW-J~jj1|YI#zHmZc%T|Lvr)w(#Zl5|GpLAoUHPt2)klvRH-5r| ziR81fIhNjif`~32pI956J9_c4DAgce;s@bY)rdP$l+Bto zyPU=v{>cv4Y}=uAt@`zvY1=eyP`}06JBDICCP$fkbdTU}Woha(wmz2DR7oVDIATi@4v&37Tova<6 z4~HYHjqopOohn-!i$I)kH2PcH@i6P8a%5S zPjT1>&meCjnD;oD`iaAMg^wd7edujWG*XyboLrm5ulY2GVUR3xO6>K4@tWe3l1S8R}ksqb=(N7R2N>&!rXUQXEAv=7H zby*OMjcBO(`ns1k)Nta4^5HcJ{NT*p$Sd9c_zzT+Wq`cAJ|Hi&mSysS3W*p&d4`O< z{FoSD@2|AfjLA_{6;MT>aF-n40hvq66R@gIx0ioFUup0G&>)Vnp(fMUx;0KKV5+p4 zE!Slq($_2_eYyKbCZz2_CeehIn}Rd1{>4ODiImV#Qy(fX%Tg)`k%yCDZY=GmC5I^N z904zkKius6uHhG4Hl8DUsqZci-W zaRY_%TLL3$T=(X5eglw1VoV)=$Q z&Kk;+Vy-6i3qV6`E+u%J8YPfnl?DwSN6A6sxN;>d!i)+VXl3FGya5UxhQdW!jt^Ok z`h`BGWNTP1E-R+b4q=Qf(m+A`PWtZs(&A+`moC9NW3Z3REwn(>@SPbIIK)okQs``G z9Q}$0(i=Qm!gXOOTPA&{S`4|(utX+$Vix*0kv)%0m^rwUW})N0efIuxq~5&@l#~T**KX; z_(*AlY^DI0&^9Xf0n8*YZ*KD;KCL2M+)OpSoGxB4MyH4jq_A0drW zjU2&-YlaOSiU;6b#L@7Bj2g+1HQHe4kb(Wb{dT~hp(93)Qr?&7j2N#PMh2i2;#3H! zkWH0;PT5n5KZJ7fY4nQ!(6~d_o-JB*?4s?|vSa^|9k#vG>)yPRpzSp`@ZWp28C^?Q zZ`z<~!+I^6+Iobn5lrIm!$|=_kJn;o4H&ixs}3GN*6k+)e z_sY3Vyd2d<@VV+^RDZqlE&fFkswZKcviC=*zM~?l`+N%3cYPAo7b>W}{bN)wRoi5j zM4;ycpt?u;`zS-SI+akJj1ndL^%do|GE{$$of0wYLf6`0E~kxGZY?c8@x%Eu1nW_iV0{wxMUAlDa}*^s0oIo&fwb5Zq$G_i zRzJC!Og@RyiewK=ehh7Sp3m~%m!i7djDR$QuJ-={)yGg#0#si@YFinqPqg1r0o6sI zI;XKop#9f8 z-F)2w)xt&MV%4IBh6V2ys3Gn!8)2Sdz77|>jg2WaAP5MBStT<$9l+5Pm#hsl`79H3 zAZ9}45oYMgls1h`m8M8IWlK}}G`NJO7hAnY1Hx=NbQv7Raq!mA6=tQOQ3)OU=j#_3=Hs35vxqio$V(ESSeT=RvLwx6C=npz$Uh33tC@p?umNflLsR}e zz80fFFX6LEP@W`+NgR3;b^4`gTz15Xlf=mkV21PmWHW+mvdxJTs*cAsx{8xI16H%K ze2fYH@s9vr8b%sM2{^~|(VV^#ezMUPz+l`veAqBN0=ELcr4cm%+l1VBBEWfw8b)(A zu-YIQq=Cr3@*l990vo{puud2G*~leK>z-R0jh!U;Aw#CgV+G6ztE3; zt?u_te`z2a#0S^I3k?|xo5Cl?~jsTdFo@aFJw{&>=9-(2=y48Drxg;qrd28swgHM60x?=YB zHRII`$!C8_D&lYPcqm&E4)|h6JwG{Y%9i|NC(eGKG4^QO&W;_IN6fYh&HNp11EBVW zi+>(Hdr9OXfVqU3b1(qY0in@m(Md8ki|;;(&BYNsl6FHtG+G&o?LSjzpdpg%UV7*z zGuvxN0ejRw^CN(c2`f8xuU>`KKR9-$j;eI*j*l%pcK_vFQhMxO z;79fMuMb}5S2j>o z+6?h3%?vNIV#ma+Sm(HAt*g5+M(^*^iK2*zM8^z!!snxe&)DIDUdVE4O3av65uZPk z@tOAhET_a)R3m7D%FPgCUh59({FlKqwfza6Sw8Gkdkttr8xP+9KM*})v=O2~4oL5F z_uG)LQ$Bbv*@Z#M(t~#yL^~y-|Njw0pUqPsIyae)-F8D3d<4;3GxRWLK{N_JOvi2+ zqF+2O`a}9%6&Ef;w6FJv5Itr=`MOS5Ks4=z$oC5cM8^ij4ZExp6o}rFqTgA2du4=9 z-XX!6U3GgHHH7JZ=!g(Z$Co+U6qx>Gpx*PchKNc4HUqxqz6WHn`R{0SrG;*UCy18UTI048e%n)(*WDv|nD~V(f*pUoCWC@5Y z%zQJm3WRY|L>SN*=nRB5;5m|&hU9WR1a%1j2#fGU9S)}YNie>Qe?86whs;rPS(9#b-wjZuxpnY0QW1aZKWa5Ftf8iUNRapQ~e8XA)1rD=M+IGX5-W>%u!J4Hf8^I}C?hJj5_mHDoXh9|QD&Qypq8)j%L8A0Q4C z2tmJP-|%mFe=5U7`X0BN0X+v`;%`ExXC6+>8=_}rc zeZ~87x{l}usgJsMAKaquYuQ)Cef%qRpWgC_5bta9RbN=2+1IR}04KESYfIKw#JBWR z)>jQrwD^s>UpY26diC3>&wKRl(YkHR#+Jh-s#OWMIH#rnV3~E7ic4m7U!J@r!n;n# zc531CZ<2yC(og0eI(p)fq4?c@-agdbzr$Y@zkl%&TXq5)i$-=c29TD z?99%l-tXJ#?b&VZZWEQ>@SXd6tDr!gu+Ov4|GzVgSQJHR_nvd_x#yny2$@T_viBdl zu)<;}#YdVsSw`#A$=%GTyi^8n{&2F^G-X4FK4JWal8hbcJI;0)lLp{-S6Rpy}jkovH? z9f=4+iMF%@qKGLvZ0&!}3XGx% z%IESbc~J%z9cWZdA*WSa%JR~)OoDY_Ge!gmMQRsOMjY*XcA@hcpmX_MLg#Cz4;ayT z^&99M33Q$_kF363=v+&&VX`rcoR|i5KF{twLd_SU<_p)j_e5qI`n%B?OWv~2c>Ki4 zFgeeWOLw4ian&K^hV%VcmaDWffliVC3fZlhDnq>5$-9!xUhOyPOCZl$#1 z<#Ol%qzN!xnibOGVtpF7SWJ7l2>1*2S!6TK4&W-POR6YY^~>-V6)=rH;XTDy6e%cv z#T1Fe=Q*&|%t9s1lNQaM&oCLj)0gwiPza~saa7TBCEzFN)f_5jKcv{RKB5K%urPR+oPAFD*6$S2a`h7tv#8fzO8%11sC9|=mVZSV~5=xh3TEjB(N z7pTXn#skRt$^Sh`0KxeK4DV(h`WuqaYQ>@rgP@R&9bF<*F7hAdS`oOu137 z0G4JWM~oN_uoM84`XN@>jf}y;;32VGtQaH3axr4G6k`@0J7nlkaR}fNFe(ibp@lauGtLIb{`uhY6v4m=w;1@!^WFa3M?)8X|;>VG?f6OX0M=8L5x3 zzzPe!xF~D{U;Nv1 z&G#>!{Rr5mIk6ZZ{W5uU+4WEFfB5O=pC6fb>R5(jq}Py1OQ$5IEl6FyaKZfYsf*Lr z{K6nxCz>OLl;?E_T$AjGD^P3`Wb2S?(_Q80*u|YRfOS?WD(Sh40M;i;yDI57!FoTW zj$-&{x`DM|RIfL0Lavk%shjq7B6Z!-w;=V#Y$kNn9;!9e(Va+L)E%jdCy$&sp`n55 zXs*qO)FgDg1F4H^t2U=^>b$*Uh@;L~mt9bfft)OK^hF$X9;oX0Km&BK6MI zAANj$=U+$a2zKS3EoHDH_b?UFjeD#?lcz|QIl9Vd8oLrui#Ywqy(e7fnXmIrutts{ zY1qwdDP()~*7A~W8g_TEPL{!XT^7K4>+aU$7Xj9}ORv@~+G+%AJw~uh?but&!1^d& z{0*>H{DI=A&lV-7V2=e0Au#wGvAXHlo0arG{FYVH2WuEsR~Pog>WNFcu)2V-8cv&Q zwcCKzz}xgrtiFhihTfA-8E^391FO#itHt9sZ8B8jxBv?2URd^SD&A?Z7MUQmLGS3i zhtP%8<{V_-RjYnk&5@A1=GAH?G+XTo4l_n+sS?_)fM2C09gsx0B|1_HP!{tGbSQ-h zo>in>=*Ya!rida6Y;GP8m^PTb=3Z=f$HPN@sMx1MD^GXl)!q1_7Z+C0*WoEb|v&h zS&GtB0Dh{53?0Tk=@_Dm)yMGBQj`El6M=pbKDcl(f{WBgNf8`=*Aa?6a%``2gZV%% zkRK!kh=WvtIL0o7h@n=1KO7#wf7RGtS7QI14^(0gT^B3{iNRb5AF2d4iV-4SUK7qm z=<&HKJS>cU0`0})Q!(5;EF>74@x9pLU@vbUU;n^hK&n1c1cGxwa7CE>9zx7Rfw{rK z;$U5nG+2k-d9%Plg8~N$0iwSpHtGYh{*JA8E>sBVMVL&ejmz{gQ4t^l^Kcxz55i8p z;4k=F<61J_W^hPXnLWSlc$4Fxknw@;qXUKxa{5G#U3K85$g6dFtq$_DwrTj>y?5{I z%HjGrI{Ei;o!ijR+Fo?#!!zGL|N7NeM-Er9}{X2sfv}bj_2h;lEA|$k%R@X+r&fUC;V*cdPTG}TW zE9^14;lg%d_jOmCF&dhcJyYwP?XY&>+{s=>wsbm`*kbe5yi zX#w3^o(~IXeql)&qA4(KG==M1caI-3!gYf|_MpOgUP>~8bB(feD1&QusD@S^-~na# z>j|zA#*0hpShiwtE!Wi|+aQA`{hoAPysrDJXicZQdZ6{pX>X$SVhS!JwBFUi(7HIS z3TXWTBu%BYjMi8fykx)UZFp_=;OcMb;<4fn6vBMAJTa*YuxZ<>`Pivl$Mo1i>n?qK z^V@%a#y?e@+%5xlUM3A3O^WLYOE#7pjq;sK{6V4<)yDEx$&w8e=$qosiCD2$`1f zm8_%ToE{T7TIu4_^>CI@n8!+PqL zq$x{tb=u$9+JW5`YoE+jmhyW0&Blv1a zFpCaByd*$0a1atoeCe5@r|8w+$Ctv7fz3!8LD)zD`!*qj3lqZ4fU#kyn^mZyQ8HWN zC;%P^M{V3Yj6fbA1i1k|-kz}RyV<$A(7gb^K|vvm6kwPH=VyHO}|KZ-t~cf_zBFGCQ|$M(kG4wdp@p+STEks*e6&Ux8; z(G&50K?=cLI3IDOZHHH2+{i$W_?Y0qj@RLP;UP5(yqW@t@u_3b4@G4;K!N0V8OiQ8)m02PAOkGXL*nouuh`7fCztT2P`3ZYan?8=buPQ z_);Fz9T}v2!Fm!O_qECTwtAPM?TP{U*DOS-K6_zjss0w^KcTO+YA^tQ0g|+K(ISAH zSS+1k;NO&!5AZK2EGjYRDtnr{s`YbXiP3DLt3)`2Y&Y4)>h*KA`*s=Xb>M#$*-a`7 z3%lWe!8qW5bKUDbd?Uhtn6e@dCgplPqnom#rX_&N+6-K_@4f_3n3;h)xyHz1hx*;k zJ2v1}e0~x9CZ-JFb8GwVoLdi%ANlOj=l4IpdinrkfK76aBQXHte8dU5iQza%jO0jm zk2o83zXAV|S|qP;AL&%RX`k0ntfM?>z;MCqMwoKb*b@@w;QdSSm3C0~D8tW!Q+Su*DQaww=I*$@k3GDkzsZ;7{BBWXRT1ad44~ zYhf;5E2YE6flVlFCYPbj)MltN&0#jrShq%8#jO%BcNAA!tXj$PE!0rT`DHwtRibLw zKzz}pSuLW~C-VF0hy);;Ksv#oQG(-M}ou<6#yF8E(KZ) z3h)o`_a7vpid6&-5(9o1#3B7jAD{#r3PBQJUlAIHovKJNN{gc2hA@#J(bwBk?_uMG z%qYJ>g9-ArVH{q#7r+@%i&vF{7b%sIa~0hb?jF3SUOs*StQ`Q-^D%b7d4l&L z+yV1=gDCt%yA&9Q14p;}1P@Dy?maXn$Yy+{3 zSMTEn!-uyY-Z?zuT1!FjO>f?ILf9PC~1r zf#%x}u)L67O6J(Nj;nt0ACmc|+vHDtB`I;BS+vJT&w3(BX3`JQ z)lYh|!#QGypEEGsF(HQ^J6FW0Eg-`RM0X+w^6*kuupYs}yABXLNVycVs5n!{=wY8J zJ!C?5Z({Vo9nz5Sj`VvIf>4~R(9KZHM9F2nExVMBMt2)20uE3EMHHJ-#P?M&p4t2F@|KtY{=i*a^N)M2-~{DNR%gzKqRe*5vgtE)(T^S6~-z?YoeTU zFAF=!1T-ZHEXI1FumI|KAw&w1pndRx0-&EVb9rCM z&)grCxgUP>i~n<|GeV#=Sc3dw1z{S6c0^>9fUH7@<&e$s5o;3@4G<*+^>7niQI}Jo zAVilS_IzE011rYS6Hq_Eg66$EMGu9$o7z=yvvv3Ipdy^Hf-qPS6wHU96~SAS&=E)x zQX~&CNs5vp?SSy1L4ygXU7Ve`0YZN}g#Ws_d-(olVBBR91}Gez1ZR6h2z$^w9?agd2nKS1E=1qs=Z!RcoIl2Y z2HMk;@Uuuv3h!zF`c*V-bMy}wmoT7md~mqeJqg@^;bt7{ftYLZQuB~W=RW=P^RJs5 zhH?&lY!_v&UY)Zdcj^3;HH!;U7cHDyv?y`paJQO_WvSz9%kwW?|Mou-`VLZg8PGO) zLDQ|fH*bCN$?f}}T;8zn#DQV(`Olj*FJ<-8DKnNYTfKI9hT|{b1fm8G4j6C}(um=D zhc8~usNv01CNHE{lI3^NtDjtppQZUhvcNeMVh4?6L7wz$aW9@pip*4;f%~3OgkG}D zjBb3e34t9dtZ)7BRrdzsMjhop{hXm#HUk_nbv7D^1?4X@h$G~6tLMx!!{;dW)x$JX zk4Ulg;E3a8;E2Yza75!~#26Y|h%9hKV>gbtVB`pv0@cY8ipE@Fi|Sl$J>sl2JEdK! zPKrP)V&b0Jo;L;*(N@*5N7pFxgZ8@S-TY9T*-%DTPfVt>@T_l2&n~E_GMXFv>}+f) zLl|#cklA0T}wZAay3_6HiSyvt(KhebwILq)RI}9_j!>YBkYejbTPTx!$u>;KN zvVcTeR!CR4LJ>kZJa}Ee8~kwtmF3a;w@o(D4+K1X*C%@`!AI@#3_8}XJTPHOfh2}3Dx2Ndu7qjYwRpNYBuqdr)FGNzCNI1$-8VE&`Vv zGOW`nA&)JyiYq8ZLBC2`X<>-UQ!jpzCZL6o7I84vD6kfU&Otv{F^@bnkod_N$j=c$ z6B>*FxVdJCPJqy#qQu}_; z`-$u!-bcc3)&7crLApRlOOTZ$2J_H)BBMxJe~oEuU+QAe#>B=%hKCOJ_eKFPIrX9= zRyc%3wR;fYmxiU`5m92y0OSE0%YJ`9N_+PN3AqX`(m=^saN?YWftD_=xJ%;gi+7qv3}&#H!}6~d zgs=VJ-u*A1+)jIMj)&K(oe{A^<0np@zi46Rn*9lL7RL=A?CCeuF)?XgU_klObwzj1 z-Fx{;3&MCFkT!As@sB^c_3>wS?%n(7z4p1+Pfi#&ePZ&=Ia&J`&!4$q`MTvRa{B&& z8(S>-f(O}9*1X=5_N(Lu#Pm+de}G&R)0SY(=}GkM|HI@boH35B|1-9If1!?pXJ5hB z3*$7zCqKQ5PiBEnxT)~SchL!%FyBEZ8AKw|2H zH|V6+NGDasj-#lk8=Y((ZJ-mrQLz_{qPeEU5)@65`J3kO`(z-#rpxc6uCXr2+g+62 zIhDW=*^usDY;?;@JNn`#WLp8um^f-&RMeAE&U|+Kw2@JEZ!0UxV~nzxO(mw$LWOQ( zXTL#=0%@xh{6$_Lc_abrBO6Ija2ymVMEQ_M9`?)Y;``DK{>ERMAn$9GXA*yzQLsF` zjFyKt7gp9cA0*qQq`a7xV^oYJ;sFXI&HfWm}R_J8p7zn;B%s`#`; z=9Hohrkui$v0IQ;g0(W%ZRFGwrQo{BUL&QP>Y|jZL@AjI4V1D6-A3CEMk($@DOhAE zDk;Gxufg)uxZiLlvQv}VQdw42#ge5Mz?H6@VKH+C2xc-Yn8G9uy@@4e7qEbjh55&B>^K;A#^QhBM~6X@1I=(W zg&0lZ)oU77jC?+VJUGHo#gJG{3>T}5wgg^6c?k_s2b(d_6av)569^yI6G!L+Ieb8g z8pJ`F;`~G(9YzR$LUy^r*H71xc?l6rinV7lei#l| zdE+>vQ(s413vmLX69Na&v^G=>7eg_1V6y@)LNch;85Z^ zT#t;277*qxqB#SLDKU=G#oFTC;*GEY3SL`9N4Z3AYtRV25-yX_`>O?u|z+? z*AAqIH;ap1{lOrjgQ8!5dndV3!A}bf>!J{ceT~Z<{QLXH`)4K(k8!_^En8SH6EIZn z0Ho_4jUKb>{)6L(?tGQ?;em!-`J(-$*@Lb z=2?G_DFvjk7Ej%Y*$cJsDL|+r7 zP|cI?r5Ai0N9f{P?3M@wig_a{81TJxO{?ZEOUI=_RRA)y^!Jz|%t ztE1zggW(4($t0GlkJf;t9z=hKXfeoTJ(RHaeh13t5cPlOT&Rj%w&^dB9QRM%~*&Qxk(MR(r7rM`>qJQi-CuNZ6u0TenRwH$3lR zsGLz?sDqUq7@H_|H}QtK329YtI}zd5$RRqbsM{-a%2(rcDnh3d;gya$*!kvu7w`#-4{9 zPIAjbdYJI{FjVO~d!FgZ6mPMN5hNID|IzbcsJ$ucu5|T0TIoNahbhip(1W7#WQuBs z&efys(fwY*W+wZp-(aYg%KFm+l2}!{4w^93jw?_9``OE<-0h!eX3|vDREI(w1$jK_ zVIZi~%$@{w<=Wo8a?i8l)K|aJD(g;vg{7`*wIHbM$wq=I+1Aolx`TQiJDH%0!BM3p zXnO3)=~TAI=ydAR!^%t0j%GmXq}7rt49<-`569^@2-%ADlmfItyOGBhE-qo@2%Du` zMP9CcvzV*eOhH090(}KZKs=tD&EtC{mYGVL87LWYW#V)=DEzNAP; zsDrppTB~29T`jHBuaq!;;qj}IB{ZlIJO@DyDGcO!#YU`z9tx3jixwh-LBxkShA|k$ zbj(GdDvy-{WI@m1VTw{r#cF^w#U5KwSRy5Z6#k2D$O`LFIJyB5jd~vme)!>Vk4nST zLpfNMNGRf%iBn6BMR*t=s)A&MsfY@iQGgcGnBdR(>Cw>$XknBXVdw)?P{^1#h6@|$ zfTSRcAo!Lbaq;wBe!jeq##{1HgR^*VC8i!|f(AK2VUqbmZXw_zg*{b(TE`9359i64 z8s~sH&QJ~SA`bf=_qRi3W5etUf(rh0Zn;RHq0M6YH zpsr-VKzE-(jJwFTDh?6h@lxOu5V<%+i(i$PqjW^r;T_{0_=1tp_6P%QNIAo+^kc_} z&2d=^O`PB@cv*SU6L21@AKza&0Lq%XH%;-WCyR>eVys@Zr&hc8d4~jhpv;K#_?Rx% zi`uccU9Sc>i!Zkiopt%EJzHz4zd2riuDzvw)u3r}lal9epPjN~LDTYuEBt(C1aQf@ z-a%1r{>qREawYHEsX78z0=g`RQl(KD_zCCp)Vz4jrE`VdAuPXD%OJ zG<9;?%0)#p?f->x-Lda0AmNt7NnuH%xeJp11TEvOcU=X+@sGwQjW{h*A6@>WI@`dX$fX}ed$x^1;5FWzIcb+Xljwie8r zGc)Op&I)HDX~&J3y>?T^4y3xnrcxbaE%BNXI-U4Fx~jjaui62x7o@08rEbp5>CEdz zQ=AD%h9=fZGq6_0j{Qf@zjyQ2{@Lr+y}?>1iM1NC!K4`V|81;AhtA3CwZF2)z*>9X zWG%(*gVa}a5?-YVIwXzWh;>&A>?q#x>F(&Pt23@ z6$OR*BB_usP~zUOP^c{s^MwL^zEmI;>hZZEFP{gqnc?!qX7HPkC+2dSaoG@*_X^*w zM3RK2K*B325u(TE+EI{R4iZ*3;0NUpALeY@q{ELE5FpVTkwxSzNQco3Go%c-4wM<| z)@tEFkOMIEU_47WiP`8#Tp}*kAaAHQj0P-RmEs*JDoC7VF`GhxAnzshMsyF`fJ2*= zICjiv>aDGjA9%c-EcwtU=3JF31k-F*iwOv{79waeYHL! zng|7W41!#*K|ylM@RSal~l&)0mx@tZsaQYHT8KMlBfl4|E`s zK&uoQ5gh|xF}(==t2R;(k^N^C};(j?2J-qO%u?Y0%p+9Kyh# z8YQ}rg_e!{UFf~AcQJGTUW0^9`X305LH;t~^&7x+xc*MAUV&ls^Xa~bNcK6{ow1z< zGo6ILdI_t0ia0!^XId#9_lP6P#-s^eGe2C|!e0x9OeE`}FT=YL2UyUo%H6}AckAuK z?klr%icdI3`48fA&^~%chTScB^k*fVSzD&BVz_n8RB-Els=u7TwWcxS0eqA z8n^lV-)w29&AR_^+55+jpN=0o9?4FVvZu|OyJ$(;s(imV&SQp6CogpTd#!+@F>C1OsLq!lVj~TU}d^#_eR?+4Y^$V(t5^aVyzWQJArT zEvS&0!I1HeVHIV(cRHS%wiKjeSXEfm)+YPi3=G)hwL5G5?lV{Jeg64pA6@|iR(EQP zrVJQ52^p8kGA|MVp_H7@IM&awzln^ZCe)s zRv{=BZQGs(BLSNK=5*cVr%#_gd+}6pyNxkmbIIfGHcVNv$Qa3`@jfu|z6W zB8OH4zY?Ev1wx*bD{ba;h0XjXDMyJcCvh`H&RT*mvk^&-evtKoBJy2duaZ{SQ_whd zbYMQrw!~THhyurYi#WxBg6R^*;8r5ppV?RlhA(AgcsQLv8$fnpCd+|vMvMYwVNr3y zL{Bu4blL#QCLL^yA4M0ahQvgLhmoTgj3f9ee9+B^9=_xzW;O<2KltCM%Y)EISE@#g z9+QaDjnX|}2%ITl@f;3uikHP`FIk+`YsS=xv@hDHDdU%A<>ax!DO0a?gl4EG>k5;XtLm) z6Ws!2$rFFta5}AwbszR;Oh~}rZTzUX*ziDa*6)G-7+%oRfK!;$arf|qw5=}?@pq>BT4&l(*Q>KizCM67@Ks5qZZ&K@}&I2!T0a|&0DnUuP4#k^IwEs{N>XZnl`4U4rh^Nu!i z4UAi{_wZNepWcZZnzZZkox7iX{l#}*fAPh=$Mm-s|YEamd9lO*6Y5Mg~BBf_7E z2!GfV9i53gCbEDT2mzB4anaS?lDQCsXXHY|i4^+ncT2=*=PoYn_ASJDvVtiS;VpVS zdaz5u{2Q2X<2#seAL|5hKe@Q5^uz{YLI{}pX4U1|+-_93!-NW3@`wt>gE--Um3mD( z?tGQN+1F9_lI094hzhZsY+%AObz2QgxaA$a;09vCgEABDXy-eJY)ryDUUznL4<@uO z+_-&HI+6yfw&`Rd#I;vCp-e+IBN6W2SDuZOToY4YClNM)2(K_A{NVD*)?G3Yu3No) zu_+N^$d;6x@&*w$?v<~0nF^R>*^7bLF0%G`Oy?+DL;1G7Vnc*T86S*Bdn0YM{ZUJ-aKr(V$dh zfqyizfGJg2S5}l9-p8V;w4HW7@>*tPtj{;dm!>?3c)-nSw0{&0$mR3kBoQA{5w?j+ zz+IXGp|GQf195@P%7jv>Ov1;1muf*~0uG01z;z-%^x!+Xiit&}G9~Ur33#4ZVofhX z>M9tpgez7TiN#V8hc1%K7xEOjo7F^nIm*q*9L!a0#yhb^n@Fseg(h&VxW)>3fk>vs z*(lKj}2I=$B~o>~t(^j-K5 zYr?#|)F42urx`RpU(g%pulDOpZ4bHjA|k0D8xC?46BJ{?9Cqy1)C?pA&Ym-O-r)I& z&jS5YLM^6!6ctOMu!->_KrCp^0?|9NrpCiva5Hm-8^evv-GaM|ho>jG!0}TeqGE@Q zh)+l)-a^DIa;#=rAUAg2`~?dIgu_TMyhwBH=ggQoX~%UU?q(aFId)-@KS4&FIhEE#PAGi}aSDQu=wik4*qWP@e(~PJ`yXDOF*#w_$oSOLw?4Rj zGHCkJwCNZ3^f@j4$N%~F-~Z|9zy0yZ^~ZmF^1J^)Td5bZn2Pm&%mYOv8R|iA9lT6% z@3=qGthPb)-wHZ4<>#(fukyIbQ%4V{tSx_Z4A(e;|Y*z1|{n|$z+_zez| zcl$`{PEe=!YXgGT)L9oSuWqc_wd_igZXR?_33R6bU7?E;Sa+wuz28z@8DB1f-~>j4V)^R|0fdLfuS|*7 zP+P7q<4d^`o>8Po)QHa&CB*`hQ6-R_KpJVT1r*bqoXu$W7~8pR%Eny~T=9TOe&zC| zOW}vdq;CE^;7PhiDr_k z=)$?;S9j4vaMy!=I1g-PdWh~S68S_=!Aro0h&>~7<|hvjXuk>k7l`?s7doHlA;U(D zpr`|MWB}tN#O2PKgCt#0AG|Z-VrhxAtk3e5t5zY0cM0A$$+5^Wn?G>woS8VAnmA_U zupv=lP#e)?;eEkG?#jDJuAGZ*poCvN@ix3Lp9>5oEpNy$bXoE22Te;txn@Fwy}&CF z_Q%J^MTZRX@o*KKIX63>!O_DLCeTqV#F@dD1EPVwa}Mq(&*IQ7(&z3ejGSdDczgnN zqcIUd0kA8&puKY92S|?IXsul6eGnxN4i1YNGCZD|IFRx5DdR^)g8~I-(HY~!0Zy(y z!9&JOPM(X%2{BcIGe|Xm0hoFbpJqm_IJOr$QuR2XA}-LUI#WQ!9Gvc&G(KVEu$b_m z0593H*k3<@3@&~9^zPFaHW!TY+`IxpVuo8JOqhz$Ui>*!bLW{5-s+iS!n_9hcmxiP z4EG)PArT%)nYxZyaoLw2Jo@5r`xl@8=1%&D=M%B92N5g~CQ z?q)%p|J2y&S<5p0Vx!XL@BXIogXF16g=aqb?8}Ea={b8=Tzd52{)3y@$>T?kj#^V& zR9Agu`jXUHS>JARx$*LoyC47OuisoacmFp({om~0{?i}S`lqj7Nh0DVHLpZL-|<@a z;>FL;fBc?Cdy?e$_RAzDqdjWdEU&$YEC1oUY1Ot)KUm%kIN*YbAOqog#2%z6ttzw^waKiv{UouT<~^N(^~|o;?mFDgcO$(m8%wuk(2P&M>%}5?u&$LZuWK2yhIcl$ zRcyjJVU5j{w+rHk|$ znp|_Cj!&fvvY5vM zuRww-^mO1ix#{EZJfYZvB+~M7d{KeDG6Mlh_<~d<7AkQtn6-N%MvfAEFmz1I2RE;1 z?zcuB?JZuEI-kx)&6o}?6U`K4OjvzJ_M)y1Qz!EJkzHJbz0nGrNzAt4DS*)=4<*P& zbWsd+p?xaJ)dF)Z63s*>h4Vns#g;Z%AvwCby12TC0|gf|dcaNZYKe!@ka>X$IoM7_ zFLP=I0|LdMLA0eyt`Umr89~yX?2n-`Yjz6QY0+ZjH6w;z#10(R+g3^|%vRzw7yFD` zDX#FPjupHJQ6A@tK?KByu~At2^7kdfhdbU3-pgxj+q#hS=w|eq1ck6}Y~<*KL~sIy zAH!;j51ScN$Bl{&8$`{M=%{dZxAO~$9hEo3(Rsnz^9{H8+9@GNW59GY zbEqCh$HjyN`e8$OARG1x{S^HN=pCuE0|j~b_y>i@3>`Tp5r-xxj2#}~=ix%SCYd<< z_v_o=*()e!)Py8<%1fND1;rs+pZrCP_K?i9K!X%%qCm>bqkOypXpQj?a@wSEV@3># z4EFcH2oLTRy+c1xUoU$*`(C~KK+A-?-*<52FpK!{U_atwPIL5jUN(i1aZqE3x#i?w@QmsaSvx8tKX zZHkj{nmL}4pXs*{`O$)MZ#oVw-&!F{rs=Bk+vLn0TTG}=fq%`wefe$1j<16)4saWL zu;04E;?k01Z?a#j-1F7s0#Gt!_FHxc?ALIpOVkvwIPe;ZCZoQCo6zvhV$`=STiBvF zR;QC)nbhwMq^qty>@At2Mo!3R*&+9Pr}RwH>}0-6P35P0FkjjF`ucSniYor%BHFIT zmhyrPo8ibYFyAw_h$c08f%kUayoqM-?ybwmT6R{0_wbMU?adzf_Dx26rp?~lc@LJ% zcPg5u&7P6>GSTd%rM`vt<{Luq^2%x&51j$;olCB%$!+h!dkuTRdlzRA@0~ywcc3-@ zI-0$fU5xk2Pt#=Y)D`gF*@m%<_j*&acle-@_byz}o>v{*k-b-L_6)rD>$6{;Dn4U- zXlAW@YBrBF^|sI%=dA|btKMNPH+%cHw>1Am%(rLfh)0~Xqxy3lYvMjjuB)nJ?6 zIcVz&=wv-wuT5~E2%EWF9X9R70$qWkut-~~!M~moq)p2b4FB-olArLY!4fL-pGaI- zEP?Ta3X3ut29}oUO7x{lq)qFKRdiNZ%(p1W&n26Sc0)9}I>u~JE|)GwONS;RQnDNht)6iO>#JAT}2s9Hww}F=L_`-(MIYI!aE` zKufXzu_!GAe8WA74e%M?H~n6h<=`+G@9ID4U1-MBjd+X?F7kjR?6J@ z^UIvKer6}V0=o9R;~Ccuai zNe)IhN$6cViH;p`PV)Vv{+{$^T--doeP|afEFvau)EJDZ@I!H&WIFmgF~w%~^l`%@ z0===D>?rnEIJsN-g~cUI!Y!f{$_e4n!cq1$_Pp6rpD@P^I$|&rU`ecgK7+xP0@FkqmYx9^~kNT_=8qlQNZd$~G+ zhx%}RgucCc_Z{FK5HTW=T1jY|B5fM#v1usIdp*|@NrSkPkc!{v=bF(a1jw6Qia5t< zHc>8f8<9FYVn{?V3^9079EI#-*}IpWt&NSXt!QV3AKu^5)jKfEK6b>I@#v!Iiu0T< zitDvvW?bmtK-bWSi4lY1qwi^OduKo|~w32qQ+iezPA=P)|kR-+-c?J&o87Glx`HVP( z4zw6MsBFd|=euzTB~2>~98zq;Aq!4|L-zhH9CFE&L#TUt8;4{NhwPO(WV;E6=x&HN z%`P;RpX|XQMH##6=>Aq0hg5B?ps`rzr54&f+r76nmqkq%7ge(M>1`x(2_#ZwAdzKn z8H=Sd5@A;Ww&3;_E+Tg+hMgqB7MUprkH%tujYOcHv9Z`+CK3Gq|NPG5k=q&%p1E@4 z=DC^mCM2SkaDwfLV*g&b>9)x&yGk=77v0O)`hvA`Ver*?&?;Bmz&Vd_Hpb{#M-ng+ZiO>#ka`NFiep zX27tmsI1st)7;EN!_LuI&j{21-1dVZ4hf23ns(7kGSn|oEM2Z&p#&l#t`wVOdW7HU zRtU>=IJ~lIjc%=ajbiOO0SF`spg9|W zF_XI#>=iCtq(Z6{+NSvwVhbsePxYmfI`e6ZeKzJ~Qzj&i9u^f6 z;OR1;Utj8#dfD6BSX+tKl8v>sjUC#ievYo5%m5iPY{Zyxlcpwhu}SZx(-MM0{k@|G z`S{1g47e*dOgjGgjM(Lu?|pq|XI1g~3lG2kG=K7_DdR@OW?g;s;bEVoMTx)t@VA!Oy&>su!V6(zm*(HGy`zn5Nj@Wi?+j~{>e@Z(z>QYTMH zST(zR%aVT#kp9{3(w56V{`SYqPxY@}ztU)G>5?+9 z)h%4HeASZDchSk=sy}A@Cnive_EP;c#rza%NlK5%EeX*H?TNiXCmSk?%W7_P(aFA( z&^SOR^?RA)a1%6+joETbGUuYUmhUuKbn8c&)_3+JX?wvXhtQ9xcbe@k*(y^>MUQr5 z9Z^Zc?r!afyv7VFIeDP^bSIU-Y_FrEUwi6vD=CLbxtZNGnC zZBXJ2WO8a>4>BQ(#gW~tA;~^Q4asQ|;?5tQIGKdFUOmV}bKd-9{i%=6eDgK)Sg?*n zc>3bm&*(_@(UO>|wQ6IxhQxg4DmvvTV(h1=+Gik>*2+UNne1p{4ax7$5Sd(VB{JF5 zb-SQpf2-`bcSof7(IO%fh;bkjC|w|vs*$yYz=!RTI_tU>@%Y(ggi@C7o@VC?cd98UK?NbXAa>-Z4#@u1!+Rn5j?ZXCfnS zrjTq+#si$Cotd1hC0N6($Xqr=2sp+f;m{N}Q8z(=Rw^Y*u#$^o?BfwcO=4PX46;nI z$;%B-qBEHDRL;=Gu!gvWU_5kXOOIt&l#7SoZ(C3wgJGbft6=;ynW) zf=|#rAXviH+jemDh(zKVyhUn7X7X@Wh|>l9b3i_=8V83Fxqxdpu3%?!J;L-jdc=?@ z*{OkDW_qFCVlTMTU)ZpOiFCP< zsceWj!J;|FL2T=sxXcU@CUcRY%ON65nKBzQE;J%&R^|#R?$AuBH$o>gdEA)c(O?f( zM+b*Kz3pvnt*xvymXfuZjjeqj2YW|Y>OFk}Ln342Ms?9fuN5n2M@I(w4-E+Q8x!02 zzFLSEwbH$jqpCl6_~_o^9lLWrc=YYVBPmnI#E%=6vt?J^fuv<~Q~&tYzpV|A>gDb2 z=&guxS9&{pxeOjYJiYOH;pl;tN!LI5{M*M5v-Tc3o_FKR2lwyaxm&V%-MmRlr|&46 zlb2JluJY-%z1-l_2UhOMO<%fj%kHX0#Tz!|*L?K#w-2vXJpMr|9;aYetxmHH8Pcgm z?;?#$-AH4>-$oiGL>g@-q)}ubjaDKJDc?3PcLNr+ic8BXlFq(K8n0l>!~CXcV;5=6 z>mrSPMKWnr_9TrpL>hH6X>32GgNCJpXMwUWKpMvnRJZpajjauZ+YF1vL>i{2Zg45g zxS`e9TANOnA{lAixN++1Zlv+Cfi#Xb@7($ZX$Uy~E8FtA`VYi$|1b0(IoSpg>n)@q zU#Q%OBV_XN`U}Zt%5vM^?@1aLi8Q95137l$7*nwrX~@$X18IxdLwiZbGJ4dv;@VB_MiY;^DQ5^F+Ta(6 z)Ynt2K28JBtrUHP5UzxFM2kxzB?`gWZ63@bq>&L6qzGm)L0E2L@y_Ph5k;D*7^#g? zNAodU6i%f?nz2v?Ay#COcN`KzRgiK5)d9LeuLkh}8cLSH`mU8R78LD-nF~^dATX(& zB+vj40zk12I^a>ROMP_?m?=2)eceY1@HD6N9%l?%Bv)&U*C{{3*WX_Z&=10?0E}J-0*J%YrGFn0LXH_GA8x+pgCmB*riW7wi7I+yuaG+nEBRPO!Wcdtq2lq1 z(YR42VzEz(7eitm)wS>!+G7rp-w|vmkB8#+6mgXSeLU^6~L6|53AjYwP(ZFD_{Hyym}u z)h$`GZ27|Co>v$kKwYc-BRp$3!_crE9mB$T)G?GFdztZPlNBY?j=`!CcXRfa6_-`; zofG_h2JEjq%^C)}eVtAFuE73@(4V>*1`5)9U1q@kx=q+lV)KhMg8pW?Uuey%X8l4> z=&xDz2J~w&xHmxm!J|8ydq96hSy3e$+;4*;`=1S~Nu~1boK8pfF03YHV0?k;g<&=6 znf^I~b&)jQJnMW#-Ho%~YQzpUyEk+U=g#Xc*-kmo3I2t;ONw*Ae)9)c zf&Fxe;moCu3l?YIg8f?=_Mh8dexX~#pna+a_NyK=9B89!4AxZ}V01#h8}bftkr41d zeMKkySJzpeW$=G!%aQ$0Tf}D7mIEd&!_~bfwI_OYL;srng#Nv2aU|o!iGm_Rf0|;5 zkCg-;sMc1;fZpX^WgEY*4+%E{XkUrlC#3e zQR~Dx{p_q8$YCI@gz`co1`$yR=7f&}n5wTIAkwc694cvTU(SI?ta(%Z{h@U@{;Q*6-^L{n&l;HyGh z5aO<#gOL>!G?=c+z>-GU3*^d}!ypGL)VDid5k-L<4aVIu>@VkFug$4e$$4 zK7$mdgj6O32{41>LI8Np#@EM_=HMvw3FdpL?e)Fv>}(;~TU*(%$u!0S08bk$Yg@o^ zZ?J&7JtpLAN<*tkh(Ti4A8<@3Obj*0E|$U-Lt+u$qs8k__{i28HD z3k3R6J|7$7kcMP0+Hp3bwZaCY0?D=)ngl!iM0-0MD=SMYYr#fhl8?hcFQoW|2z1Ja zB_M&-&G7d?iF(>tDMlTwj!{HK@?dcM1&PrCbc%t_Ktx3|y$W2=w--btOAB)g3rj2f zVy056RAzc}-rUN<+75p}$1XB(N^e;Z9T4m|JUStASz_pQNsU`Lf>yx)j(QOnyXk{Z zzWnB1`ng@%-~GdrYuD2!O`94Kx_HU%b?LJfCtrQ=k@#N!xW3NL{avF54sv!G?l~zk zWWtyY&DTD^b}i|_z0V&%c$mATx^C5{Prmy4-XFi%zqq_2C4J_h!y6}!O z#+LgRM)aRFY-`lA`Kbr)@7cH^{npPfg9^8uxpeiG^y(LlzC%b`mb!TUrnfM{<-eB^ zaP~60x*W%MI~hT-uZSlFsq&~}soAv@k2x{~K(oM6rqdWKXAcT_QyrK+wo^2omy3S*`8gFzj@7h@pI zqY`88HW7m2H`vYvBWyEeg#G`&V1$%zi~xrz9a57oGi=6XhSrm~Nql+s)rz|7Z!p4H zFoK;4BNQOOL2<6N8zo!>C7hEf!TyLzJFxYF`n>tML$zRpuY}*qml^6VtDowgJtams z#2CTS$OvLQMsi>TJ6t9<-oC7^H8MiwQJE38wvMN%wk#sO$p|eq&5RN1!3fnSi4lyk z4a5lTRfk(x#H!2)1`{)-HguYp|JM!&|?hK5pyu-`>D%e;1@)(^;5a~HcDpDV=H*nvcx6|56HkQ^HebV%^7m4S9Po`l* z#@2!ww5+a{dPDXQP<(Uf8HD~4C`F4`li25G%pMB`912l7k+gKfA!H$aEHQ$77v zIP??yOZdrp{4`s#^dh>4OjDpp+rEA9$F>8jSXrV7H^biyX2RBz6=yBlD6A|+3&~Pp zX(5_hT7Y-#diCkgQ@pm`nRC*BeD$DB-WjcylNN6Pre`!=BK~Ozj{TUlgp52#@^ZmU z+{@O=LT4^oSelzD6&$Bf=#_%fT4iRAKb57G3AS(EJ}t)I!)ffOQDLKJhP6@JHoU|g zgzcZlIhWtL|K!VuOONc#d-z_O&*JiMkD!z(gU8h(sW)xrx4+*h?X?Vba1T&~3>!Sa zUFqwWkX974{PQn0lI|aq9zJ;V=)o6xnU!^GK78`%^N)Y`*|9^1iTV) zULQ@Hng0UMFPC|?=j?gUUPI|$y@pEv*#cH<6>rx5FJa%+=P0gR7HX}U0QIGXZ-e^c z6Z-8^tsQFr%^RvvtCf~l#A#~v2enwp>^Q7%mkv|$PgwtJg}PEvkpz5POSK|;Hf(c~Zrwi*kXz|c~(%^TD2+Nn4#UdsZyAg zkyEl|8?48MO_k=FlJ%SN;Z$j>lyeD8u^!u}Ek};9>i@!#{q8a{*{oz(B{Vl7q<^r|U1ats-erUl!!8-V^q^|AfWT7+g*@xJ*F zJAwY@9#VeZ&)C`0CMRj{-q%voL`d)P{(+{Zio*qkdGPL1@z2Hum2KrsZQbJu(CT$_ z?sfsaf^+M@7#G;?roj#e*7D(UWs4ga@+#Oa1!zEY`2`ylJe&85kXy(#Bx29Pk~v&a z;FFO^>#D(1lo+z|0~Ic=1pR=EGFf^Vq`EFWMyl@Hi!&nmR2a2sf?9uI)HC_TRqBG$%@C|QfsTk@KR$X zSgU}5Hi9+2iGT?JOh{;Jr$Hes+VVC!Ti#Bz!vj1?=D=-0Het1hZ$+VumlW{w1fMT# zB|9Z*S`j~*$1?;g9s8V~Em_#$%~)EX&NVZ)5b%4>Qi&f13b5vF%!r)qUfWA{7F6-$ z4e4z(c#~>tE&E>4QnHdzlH;igQcolc$y`rJYK6Bg;-y3@g(V)r1sIiNW)0}ZAKVTw z4=%ymqgviZMUXE5-t~AX-U`=etOUG8$&!N6PaBOY9qJrM&_6yB|FI z^1H_~TX*MN9&gEc3~^K{ZO5i;%1C|m#f@k!|{7w+Wi6*I!q!@GZQSjDEotqq@c zNXV%9bJFempFh0!xGZhUj+K`l-@SMDH&3n~-jtcOeBtV>?7a2M7tbCSI>==}O2M%Y zuWay~lsIF=q>#wC?CHyDnkpApk6d%G`4rOK^tjBkdhx=P@=$q+-DHn&+Y;DN4Hd0 zk&YHE$n5uKT}`W4etM$ zp#F#q_0{WpK>ehp8_T;x{pG7CwjGzDzGTn33r46{-Q0EZq@J+8+!X8g5Z3p3zm8$O z!Dxh}7_r=@0$5*nVBaomC%$1<&1ZJis%lfL59sj6om&521B5}E0LuRtebqh+Z!c1O zeAK==AH6r{BVdbN;f*T+w9t-;Egs^1IeZDpVn`R0kl=zZ3wTKDt&w*EA+!)#2-Fd{ zsNp141NHTeI#jh5lq=#4mEKteMZ!sqQkSiUqrlanniYWfy54#e_B6uedI|PAJI)rk zZ}(r2v9i~#602TBB>{S!)0yKe%mXIh!GfOJT3C3}u1u!b%$8dNB3s4E57?`cFBFG26 z62yzkTEGj7cnt|iYehvc)%QSQdY%%zz?-SeEv>CVTh^qD2>22KyULoq zgayI9xjEsqg@$3amcU+VsZx?|qEZP;g~|*U-tlTWJWIesfNW90De-~-6M*6L4PE!p z9J8j33=9YyIDPblVIku~Q~&+xOG*9eIZ`=?>VJEf`HnvIdCgb~wo;4IrqsDfN$a#y|ID~s6rCxxM_+p|YY8pbrBZyfnI<*nD-J8`1B_3qrYCoPlN!qmZxroy2MtAg*($*JtRyPhpBvQr9vEIn7~ZgvygNNG zT*y=BD~cLAF??hB+c3Q4y>1v@y2_9O%?kELRlgmUKn%Y_`SP# z?%aEL`0!O6!nteU`WDztXcqihF`qhIL6aUszgY4vj5PMMmB6ayb2QEHZydTT)Mj&rPq9%a+^?B6?StdAMdlNYR&Ay|p zKOf-REPLX(-NYpuI*+2EWM^jzF7G?B|K}FISyj?d*oEU?v>0%Fy#dGfpk}YFAskn{ zUne$M9)`h(45JiwB9_B2T3J)Hy``ZZUer#(zNcZd3&=T+j}fDV7$H`|AsB@Jim|VT z2o&Nk#AxNrUJZ;+3PVNyLWGi&H5= zq=1>PE=&=MYb+{=cXEF-O@B@ek^-Q{%NbTOAqzt(67U_mHziVhcRm z8qx~u3`AQMF@!*0XUMMuQmgPnazRf&7T*Jj3QxeN;2+*fMePV94j!PcAmmq~-q%qF zAXq9afbbmHM61*hsH^m5qDo^X5EUpDS|v{pch&0!qlScf1_h0okT@kdCEmZ`%bVZ- z`Hvs|xr3r1CE=gH09Zd*yDM{qhtk4re3X(?IXDlB9+NZ*Z_I1t`o_Z>$3`a2-B~a! zF=t)s>fO?F>GsJJ&5hghFC=~W=>EgU535&gsat*nFGbF%%=DIVd&Nte67tI_J8yp%E>lZmYy0^2VGC!l_Gf~n#?RdRu?t;0q@__V| zCrRtl)37>rJNkR+CoHJ}>6Pu%pv0hF$9kGZiKr1#ax^|Ab5pl(p}3Q`0R2C~%89{j z*+Ts^sRz!JkF&E@XEN3tB>%{r>-Ee;EBEtD9Q=FHlvId+-f{3F1Y$wi_XX8FHQUsyjcj0{L#`Fyo z7YW-C=`wVR=0I67G)muex#l z#P%^Im6Wo(v9zH1>gB6{Gtk3G%7A_U20D7Uxp5Z(#R+o{N6WNhfC0h@$#p-u@ zIsdCug$K_6Ki1v@uBtm-_g|Z8udyqjpfo|GckCi4_7+Xl*y+8)ruW`EA_!vdUDIQF zX6|I>=G-&q&b|LLb7nG0CW!^uWvz9e_qX=mY)~_q^Z9>fb|})7@7tdDc_FC8aYqUQ+-=L33N5eeT z9-{k@8|V6r`N9iM#yI4TU9G|8yt5(mtta1jSN1IKNV0kCXG@;revD|12a6YK z{8vVH#c=M207!*GLW#P>wO{oVCef(tgL<58kp4dOeXadyn=y7p~ZOWO3)6sudPc}e2QcMw< z+ULm>Zt7EfNRsy(;%h{B5+)2u9UFAwjbz3qN(2Jn9*|c9`aC86!)%W|xO}0FmG!3e zd)DsF^L(x5de^0o9)9>gKK%YiG(yDx`tLh<^#=J2Z^X*sI#8*fgBSzsUDW+^|eeO_yh~A?pi# zpO{R>_!_>4URJQqy9V%WcSZt!FM2V%bgg$;RW(cHPw5aJJ_7MMuLJSng};dSj`KRi zr$vgzJI$YtF+V@!ok7EG|%7Vu+7tEqK|b)0E2xR*Xh`-i7Dq z#Tz3Ke+#+%zjt>t#2Xhg#0&nCGd||5Yu<>;(4HJC7<-m-`72lZ&NTek1RqU#X$c`7 zn_r604L*|yAF)yA4P4jMn5!fFc=F9)+8e1Q1Lb92uB5!wZ^?{s2i7P2a~u`^dHqn} z_v@jp+h71`p$N4dx1J9a)(@=v0TO#|t$H1|{`+-GJTI&l)~O*46zC*91ouiXe#l?+ zd+ulG>qEy=RGvS28NifR@K$-re7ps)UxgP$T&Nf5kckKHuJRDvMK|7E=`rMP;6bP9 z4d5tmh@&SSgYFz2BIF(lR$lNpq^NKeU7n$wz&#U}A!n7#-<`$fDrW)z6`fShYKR}j zWdnF{j)H??DIJ}JG{qJg6`To!A+N>-*up|-W=#9LG*mU7`P#H869L32<4Gup+ln}U zvY4Fa=aX#|45P$_N=qIp9nR_>iwALe3_^djo-hr>>(q-(NiS+aQX_hnS-OMiW69N> z#>SH;3gb+s&NhSpp^ae6*%(6fgG$B7%3}UpOekdY7d$l+%?F@QdV-QgO|~A`Rl|M( zW*ls{dDe8Ac;YJ@Hx6H)q%xukghss_iVh5xF^r}aTw0qN?xN3)4Rf@xSnT4vF6~Y4 zEa#KAqAPNvs_tF6{PEA<3!?XTpMUnrryp-Wyng!Ts~;p+Y-o7D+J4&9d9%%?OrGUv zVZx2K+s`dsy)X25Qbcq@T10&2nLVjlsR^-h$D2bwe)ru6?|z!UKQ{T$)vq3Z`Q;ZM zY~K*)Jadu%-m3nt{!7=c-MrPc(|@jAX@1|$j*652Q8Ufld~!#zji>v3+dT#OTQiQm zm6(%~AWy|~Zr|>#0df3aylQj^7R2$4#^1SkUHdR#+sm;n9&mA4$8vX_dD4g5yq^41 zY%AdyN#Oo{_z#)|tC5L$wg%jZ0Cz>>tH6x`SB5-0^s=&;tEQo;gl@yOYvf`pNhZ-o z&)7}q-mgv0WmQskPUy~Mee{v&&fW`jN0betd+?f4BavZU7|PB&F6hvmoKhvHW!-#2 z_a8O>e%P>zh|kcq(WjPGHo%P)`8v0@x$3U%ry1b z{W?S{p%FOel`e;S;46lvdh9MekdmC4S>(sT%|`U|4#>+dPHMP*?dm`4#K5~eF)lis zZF-@ju9u*%+ra$(hPQW%YTM!Wce8g-Nzfjh^P8T9qxvrEGGlhwfGTBX!5Pbm+dMMR%cu?&2?oJ{QkW zFFksd4&1ekjoKazUpt-}FcP?7BqWI@vpX9{``I$lq|VRwZw3D~ytEt42R#q|ThKp( zxs7l|-6(GSbFd;vwLu6P3RVUwgGHTgnukrdxSp1!4A$Y$#v0XX1suYkufzt7zcKvw zKyKd05FU8`YCpBF%+FT|eYc;V3Sd|Js{L^1!bj%qrS=qY{#W!e@}_rCK>jUy8MEiT z=vmHN^yYki_EqB#knVf&Ncc@Wp?df6#rqGj*r4)KdUIZaC+DU1Hp1)4_y}i)@jCk8 zhCaR&LX2QY>*H(c=L@~Or{2ujDVJuG4_yQL#VJ@Kpqy5&clvcNHW*;mE1<2#qiXpH=U7n1*yHuKMmE;gXlPkY!3}!2txubRctk3F z7}GB?UW}7rR+a)rBBBMikY{HfaSdgbo|17-*zQGkix#-7*b;GM(Y6gSO#ykS`_G>! zYC7}PCsi@gSAYBQZ+`bd;AWe}cENeQT_sNDrZeVPSid&uwMkQ^+RqxxO|{zZv+>xQ zyHgJy-M)W!z^?csiSpPJ;Yap2gna(#dwp`x z^$XXpJ-moZ3!$s$Eo_6Nx}yC*#IMGh+7|p*;LK$KZyi5ztnzsD$-}8RQQ-+$VaJX} z#TO02Lw4J?AwB3%&_Ew~_#KyT_?IT@oz$ie*S(YOAjnIS^Gon-QRkG+EXSAKJ?zV_URD)NF0V?Wggryze%NJIv8=LH5Bz63MuLA2z`vV;|L`7&<;$g< zy;BGN&~*Lwd)97%KeDRoc{Pti9%#Q4_-Ri{amx_hcYW@wF+QzMD~$A1+gI+3&|S1D7~6A}rR~?wH2&12gkU~*6#GwQ z>)2nFS=7=xoU~_mN}?HT*lO6{n9+>=Xe?Je5{wRO^ibH*CNG4Fm(6gkEb%w|bvrzen_c z4%C}qFTfws0F3uh_=-M)H-PNt$NL%}Fz_r2sJ+!bO7IxjJ)Vj_Pw@cz@!%=d_Z{?6 zdmA%qd#ZtS0skCC9~Ge=4+Fq_z}t}apaet;m9L?nzn|X_K9idM6wt@3S*>7zuR@JC z5fDs(ClNW1XSghA%zW}dY$I}qg(zLLU4m%=uIoxz##ZVyaDV#Dxn_&V zc-0yHcG#10T55}uz}`XSXb1^8Mib-M&KRlaom~{J9M;A}R3!>TnIRM)Ml8ArU^UOS z(iX5Ah#JRp9A}>~eF|ic6K7apbqaw>@D{vHm~ZW}rO5gLduf#o^$B7KwEXO$LhZu2 z47j2IVxLf;`3F4zD2AbTH5=c>!Uc0+cQgk@$r2oZf=Pu39T*YZ6z+oiINZ1*LnV9L z;jG_1G|1A%VX3pv>ixTpZQCDv_^s^x%^fGgW3$t?HTk!+-TU;tZ@${%Z@oIQrn9H_ zRBqr@j+gC!?aqf~drTbH5KaNc;gS zx2un(WZSr%o zGvY#{lF^sf$|Wo6UI1v)1%RKM6bJzF;Q%0F5;m$q{HL45kY}6JbbkjH3bKu;2ypOrqiWONH5Q33r5Jg-3duLQqEpFv**5_C5icMtj=M6YqQ4D9Z<9OmY>g1rIWOO0#s0-}TH!sDTG zeU4#>hdOU72ox6 zgxGU*?-G|~_5mJNC$`2PP05Pd`bI?jvFMnj^!kL3x9VD|-@B2td2`D7Pu_X-=I>G;88K@Ek6RyZu)5EqdY7aw&zJnTSS$k)I9{Id@# z_u_=b?$|r;fAq;GNwUDmU<<$Pr>~v6efRd&AhXqht$xdl6DzVKQVWlqm2sQS-TmTu z=bM$CRjKinjr(FkkH$u4hsC8O#-(I5K^hsp?Jqc}v@xG*fO5g5$p6T1Qs5u z+g}I|)g5}_;ZjLD6qe7hO*=X~q@|-mD3!uPhqgkHhqCaHt=XQ++=1{AJ0d)22e&VV z2YFhWJS;LL3wLgZ!^7y!smg}BY#jMRA4@B*99bZwT)5DC3HuF?ZuGa;7Hd00tU%C( z2Vd&y|Jv|y<>9?k8Rey#;D8)S#ILXq3lG(0sh_{PsV{|xJgGjAEJ;U(2j<1Y_Nd@X z%Cz+r&Apdz-@3gaH6ypM@TK7)OjjVZG?XeX$*z8=Um@JDWbq+>bbKf{jrh=`Um=`2 z_rJb3_)D)89?BDsu0#_pfN!*c-dh|_LCL9pcsT(4MXv}QHR1c8ls=}0+E`+}R`ZV0k_4C3#a@^vLLY6Eua7`5x@)q0D7Tmvlm#} z()CzRe8bc%qX;&^%fkid@E~7wzE7KB-udtZw+rUAI1qxcvRo=R<=5X+3AUKN71NGY-VRxldjje>gTi zp)j{uAsXbnTo67t{gb52goa)-(7oVt0ev9NWI)4zrpm;(eVGghW`=CsTp$OzpVZx0pP{@pt|!{1%P-K0P5IScQ^n@${lS0 z$k>JeknoBCaBft6fcs^%Ix7uzwUdFY)RFsCAAj)h zIz@mi&1~Qx>~Od1B7pn95&^FEWMrg)|M+d^Jy0EJ`R`v^nE3fWD-ZPfzi-zzTnN)D zcgTwkR_Z%;zYa@LI{TWEUEXx&((PNf)~Du_oG4TZ&zN#&M0ud)e@AOeL*9%0m+FJ4 z);1>6Jk@~?QFCKMX2B^9|3BxymX>Hw^@0E2^))|f9cnSIOb#8%|2?77p*zO^1P%Xt z8lN-`H5wKqjpl#rF#l8Yo2Bxgwu|`RDhYSsr;wQ`2{hs8*)-D8Gh2?~K;*Ea!iWGs zdbE%s987zH@s}DdGK$THFj5N{#H;zugLnly*ttm+Vz>#H-4uuo2o=FfL;w{ItBE00 zM{F8GiD7`NZ$gkP5MyCs{TM0{R-#b^;822ZN@*&B*lj0z9WEO zJPwgB$1C7ofQLvI#NFLMI02Jj&h05>>aI#RBc$&*!i^a*0bhxJ4^ z*20q4a4-Qgi`S;YjA53!wF52_q4lFiq~Lu_yuI9<@P>keA>4%UDdS}9izu}wT{^6sCAAj}7 zFK+a-20@85&KS!D6RmdnkK?AMLiSS|Zs+($d|G@=4DLe1JiH?05gh05CSubwHZH2- z!G~Xed5rT)isIZu>Mvfpb@^Ufz(l__X)9;V-LWs@+Rgjd&IJ#s|LeK#9?^cK^7gIEZXwiyJiK8*Zi$-SxTvCSgVufZC3#}*ZCe{@8 z4hR*RBLt&Eg`z^%SpRQfe<6KmY9n%_5IUUGobZZxal1yU7o>P`1@WRu+fNb_2a;qZ z)K98z)h`&rX{7Ma;)N+j3NTiUFGj&oQa>Co#GDz~a!JvzjTh-#eSO!Y3YaBhq)^&N z{Ulw%P|V^*=S69fjDAvbcE08qs&)9woe3 zD(Hm@ag{kj1zW>~oL{=1LvsG^i??py+I%;^WPk1}Lq!*c$Osi}nJiTNRWQ_y5hML zW7f~tx__oPQIdSGh~z(PhTP3jBdMW&I8r2PB86f3nc`x;cI>dklV?i)BG~@bl;JeN zu);Hgxpl^AkH!66Z;+ta!oyYbM|MqB^B zxyJzZ4wUXgtg9mPM)zrm6%cAqYAW&6k)mD{)ha&Up=(9VXM<#dBtAL(WJE`CsWGMq z1bnOUG;f8akQrHN3ezS|hoTch1W?}@Axll)9X_G4JI-p`+OPrvE;$A$4-`zDqz2rF z0DE$r6Yz~uZ6LTPaGKl+(+b|fj5_!DOlS?kooDV$x)U>Xrn&VpS1&r2Ks_)Y0b>tS z__{eeq9_m?O%ZRHiygx{zIU}7=l-9dJ;`Y~Oc7)*h&LE7IL^h50(?+-Ndxq@4$fY_ zY@p+ZzZuj`G{j-3_d(3kL%o^fBu_@`} ztsNIFp6mMF!!N#k`=j6g;r;VHEtSEO#uyoy8jdv@ziPYFB$MFc$T!N4czdr1+I4vU zuI<83gWWswL!c9VH#z2bWGepk#kAl0=(F^(OOB*+4r@>LT)KAt%K1&}gL5{zPB+?A zbMN8Z>*t38K2ziN%%Sjt`noqxoUdwbKDPVdp4U&Dh>c7wudnI+10Ao1-t#}nryuLK zFYM3~v(M`>TNbjFIVR{+n{=C$qPLsGSu-)NXtUwVQR+&Xi|INYqxgDYXiq zm$Z2_)Q)DWPg)45ogq=%ptSFbb`q?>B-lWMZH)kkr#;&2BF!GH zb`YGKBTvw*VUavvD4kYb+nN}UQ)lTJX%e=-)Wddd8)5qvu>IiL*|wS@O7f$^3EO-0 zlKkZowrTn*O#vV;f&i%YMc0J(w6qik?I8`cMQ<EIPl4CoiS*~XrO)iNz)*popNup7TN}9yBV~l?muhq3`4u^tOnW| z@ehM`R$ivOy^ijkY3(v|(EXA;6XZGMr3K6@W)~3gF`KTxYELU&6J+QH4{oo zk#sR&_K-aXPcP19$XdjI)g+*|=3oIP*a`MBq7#RvwFn1J*>Wcy8MGmUGLE#vrE)Sr zD_!lXLTW9zn847C7Q6&>%sHg0l=*XRgM>+BtAp-OJ)Q&Ml-NsyVa%VspHedjeJ0WK zJFjP+G7o%(LzL7i@zKYyl$rYL>P54N)(hs%A*s(Kn3&B&O9Z!A=#yhT&2=0+{@GzQ zr=<|v$m|^i_SHJ8F&t31@|eY{5n@2tr>Ioe0vmYECbPVYC5*)!9a(3eGIVrv7A-_z z0JL#y#lqUrmDEiNNSX|Bd)iU3pMYeZIzrX>Aaoa|bM+2&^RW$|b3JpTN%ufF-85AhGbrP!Xs z{;~}JpB=JgF}JMYXz1~ytAcGkGYZNpYwGHn+gkfVKK%5{swjD8CbmWrqRX#6{-ko= zg17SK&s?^ntncilzN=?S%TESyocF^oZ`XEzeD&`YiQ+TycTMC$s<8q?`_ls6H0C(wC^2Ps0m@KN0-zeL;mx23q`p;qCGMmc*W{j@| zH&=rD%yga^-I=TyaGPsW(LPo2IlW}NX&BpC8PN>er(ccj8`o8vCrZh7LQ76gMn*~V zC~jwu;CAXpU*8q^8g7^MT^SzVDjBy`r?_)cwhe6O#O7$XXLZ=l&WH_-8o5F%C1yIuCHsD1AIEsPl% zvyo1DvT+n+c5YtB1(NK%d~LS2x}r?O?D*)2lR9RvBh8MM+3Y$qZmmcL`8ZU09?afw z?|O0Xd2OQoO#GW5HbSgPq8;kVbai*rW-c*Xe4xp*6@LJ)W7qB($?LN0(kkM0^3@M1 z$^NTacCnRc-QV)8b)W@CHlt|0Q*)t9>cvzscgt&?jZX>JRVjBuzEsHWL8fVN{xs3L zyYR&nTh>~osulZ8wL(ob$ux6|^I!0`l&6h2(WTF7Veb>%%2n(UcME&Oy}}-DFaNsX zUfiR?{f=Ejcs$+pWG8O>ZWnimJD=NZ8EGI5k&xOcmKsviT3}DGrwcWt(*){eV2sENDbaD@G))Zr`m+8vx(%%Rzyasf zqZd4$;wgvLi-0Bz=lwUJ8@+vxpV1iNK|&QWS3|PoAHXWG$P|z!Xp-Zu)d_;7&Sp&{(juAR66buhTpZnS z&Siz4FV7~{64KQx#(?rZIMu92^dp;>*txkavhoT)w0!e{MC+)ywAWMNf0dMzRhpfg zlvWXMJ;`!KQcFYk^>^O;~dFZ;ycZ zK0S#4KK%QLkq}pD5T2Hil}re)c@g0adI(R6X9(|-5I)eM?leH=J%st{b2!yQep5V( z;CoA27{S{p^PZKHoh>gOLGY9y5WMgg3ErtAxI8MSI4mlK^fwxU!ma%;M#+aAHRS9YF}%0kvuIa?nQz-{5pa+W@i*pQ~fD^ z-Ov?97J^=0e%pofzXIQBNx*j~;d}S?%^Nr9<6A4X*GO&(s@wXn-@du&N~qewg5fMJ1yMzWrEY4&7K}`F3)pMDX^f zO#=XU+MSRu6ddvU0`YrFcjK@-F|zH}9)a8rTFX_n;|lwdp|v41%1oXJo>N?S>X*z8 z^72Mx+XKf`$A^w7j`GL&qv~UZM-RV+>saC;?yW&w$Py0!`7QpC_?8N<;}87wruq#Y zH)FZimHU*h3wtNwMEcHcAwjGCz1>NOf_fhQ^JoB&s++?NkumJ36>(Z^CR>0skj@{@ zhF5_A%SWs?`x14sjhM4}6_xL*? zF1o7lU~omozf4Vtah?1~l@0t3Dd4sl8J_z8mx z0yv3n#v(3ghOP9iiA$&1L2k3q40~ZD$aMEzxoU+Ub(YYoLHnEwP^~Zx@W+)%XFZhf zbaHTXUI}ea;wsuar}3-|bAO(!`)E-x>LJ{g^#RZv<}S5RHq(cRH={r1KB(_I~{ zJ(ZieiPH>W$1r}f=a!8VHdG(lc`_mP_{ux)y?yK9h5V{37q2;gR{Q3zE!(#RZ-*#z z<%aUJ@7>(FVEf5kV`dvTukv(X>%HmqsDi7%`QzmvyRaQ6?mznSH6ux1#TBI$gag zcqL`w*wu$BJu@pVs~auviu12Tc*bd65}wh6Bz$j4o1$!}+=w+#7{W^=gtLmcpfEYm z*JoW8Up0u9w_(NEE9jnRo8D3u4iRNrtq$TX<)y{ge5HH2io*ZUtWRa7M1+&+r1sVb z9jHo&w*ig-v-PRoUR@eq5qT-D=JD-!KYsk){j0sL)rA^}AExHXa2js^ixBTR-F>F- z?46t0ImLwVpJ=RwQrFWrJ^uY0*p_1X_r;4B&Y$Z)+t=IEO?yhx$v;j0tp)gj5ddEZ z(LCFhf@V@0io$TRvgPdc+qZT`g@z_{_WxF`nTk>d{!)aeqH9v}8KvNDzyCcD{%=5d zsdw;5gqP&h6%fMZx+MHs<-dO~ekVKI^1StVi(zKPD28u4mY`$!*n%>N;Z4oY0CD5` z)c(MC-ua4Q-0)I2ZMsg?qj+9(>p7GM>TZLo_AG2nk!X^xjHF|iLfV*WfNEZMnM%wT z^QPovQL{TdJT5IuQq6y-*X&lNKg;+>x{!e*xN@V6^t9AeAx%sd($wijbbUAbX%3hD zW0olA@la(-Z^5T1QpFT8S)F8vg^+kYP8J&@L>om#;-)))a>0q?I0kqGN6L1F1kx>c z`b&lU4oM|Ik24^mjWHxA$jt|=Oo{c>uHfNOBbx^g%W?BbgE$+Dqcdl!XAQuVMm=NV zOm+|u7YwnAO1r2=i|E}2WbeF{0c_+UcekF5{1>Z8wo4sZj=l`tnq>eeX;XdxFvrp! z5i%%p`9p=-v3xuPEdAE z8&)(3MoeOc?i`x%coDqk$sUMaNuvOf#THtWng_^J?}ce8XVB3q3mZolG*)OnN{UjN z<)ZBHoZ;@gjEz*;9F{VD%E=M$sPP2WBU$I!LrLnOA-tN388w{dXHhwYzcKt(Ey95m z7|}2H@L#ohMF8((481ElnmimY)Yx`5@kiFKhkE;+jxIJ1zShg__ItUxtSNV2lNOMg z9+`L~H7%Fyx8J@L@y7P5yN^P?xV{}xeWBe#%jHYWee#-bUfOTrxj%J_hws+I(a}-I z4}{9^e|;C15qBT+4!Qf_x7S`jhXJS9*V)z(8x)^bl6F0{qPnKGp{}aBzOL-0tgqFu z{^Uzouici_c3q@|J&ai2@lw{;66>QS)<+aD*7v-O^*?1jhg$vx)^{-052x#uBUqob z&etb2_XXA~ZYXXt)>jkjt5vr}7?z>s(jc!Y(A>4vuwHVU#8xwU*;1!`Dh8az=#-=5 zLae8|QWERMqD9pa?Frq`f^tM*Lg7tQKtjDA@T~3Yi3T>lYV*R|-cfe-ZY9bVZFRV2+#!BbT!Brrs;JZ?_!$7hx|eX%w&>%l%Kl zzQTKr7WSRgA#W;?*OiZgeKCW5U&}!2vlc`7=!6|N2(z^b``984>}y(|H$4aJGx`Is z{vzxz0QRbGnU?j*?4lG)+97~!%&2Z)9dfO$fv!WIk|lM>^+~VldU{&br8*^c3a8Xv z{AsaUJk50poyt>Om-@6}&zUoQ&(4Z{1HD3@*gJHFN3~#dy6aSD2j9+ji0vXCT${30 z*3!)577E{BR99P5Q!P|kRFs#Mm6jCe=VU^$936omaPl~ARPMw01TLiL#2Kx{1zUf? z#|V0PPwcHy7up0_IQ4pkrDGgfe*md6kI;a&4YcUk{1jO7KhF?%n`ZE^B;#kowRpBb zKE^!a1aCGCS-%y|j6*8ufY5>-1dd?PT+zu85derAL_-6r6n6!|o$5l?KPTPH7`B89 z-K~!j8cCAQ@ZJzp(!Lg3{`K`!LhDa+Q>jA%EhVVRdHvlJGad9>c#U6=2xQBa;d_vw zQ)0Wo#u_EaBD9$2(LyRzE3m~6RFcm;=o@ARM#;0h_lYoeZ$Ea+c(I6E9 zOiVv`hiOZ(PP`Z$C=3!j{MO>w)|wT(zY#{L0kAycSE3(}?hV4cUdq31y^Yh#0Q+U` z+hW(O*_G;bJo8Wl#P(r`1I0=42^sk*Cpo`_V;h!E;kXs@j_&66&Qm>&bR^F{=yFXMs6Iz2zqC55 z7Y3^8r7$31U|N$|o*><%9YV@ao3pt&nF%K&nQx`kx0zN}QJb9@17&3~bRg zZ7AnwVPLyf-GV`BX+zKD+jmawJ$9_(-l&|vSl6~`({b>J{lr|@* zbMsf7MS}AF^9Snt%6rPY{5|fz`hmgyd-n$Kiud^Y+ymhu|7hUh-~;iY@L=#he~-T_ z-r;UPxy8Zv|H*aX26tV3ZK2jfw7>66cNbzJf+EJbRpli#y-rU}PKccz$($?pzrI`I z|AxSI>(h1HpiO7zTPdf9kOlra-U?*z@M!QK3Q*H-uKysOVrdIzY-)UF^$Jx0 zhnKO)wbE!s08X3>WZ{OjE|IL+e4*XMLyfNuPksN6pdfmY=u!>bLk@{93&iZp)Q;Rz z-fjUpEQ>8IFk%I0r%stlYWYQkMwA}Nut}*t4HTszCpA_m<92eewU*f|#eOa=RI#oP zIr;Fcc{Jqm1oKt$?;&?LCQ~#aZfZVtgL9JWTnDgl3YxO#}=fB~k|q94)MIe5szcGWU7t0k3DoA(@h%dr^d zDaS+O60m<$lo*$gQ5duLU};HyVPj$J`U#w6R(E4lXKQPHL-w+<2F3;x4V(>Zw(T9W zwWFn`J!ft3wR<`1S9k@i*buxgRa-8*BJokhsrH}D_0@jh{N%Y}xX~>sp&DO3&9-)zuZXbk-KU6(KJ!FOU~hR999tHdfa(Hk7{{ z^8X8ZMvPbwFv!0yU=L6>67oMs^D+96kHjUBtaC4gd|DDjCK|{eY$wQ<{|k^mt;zNC zG_Cn+J;)apCaeVHD>RU=0_3&RRSEL_l3$0q zhmh{~WM$>k@o7pd=-(?1{-KM;zeR69dHlzhFaI}juU@?fTd^d2$4L>GnMotogp8uP z(-&{wJ+17 zy>t7y?4V>k%#1tWmEP*2vbbdA3%7a~=1v2-!Ai@i{P? zc1lr{&@o&anY|;^>btsOObb@3Ng;_ha2vp06TRV()DuE~#s!wm$j1#a6h_D2nmYcZ z!dYlGcjmOI(`TD4w!^>_aeygcz-)Ze_+@aT<_p^D2oLy-5V0>c!GMAy13oeYK?0=z z^j^^8U^+ks(!z2z(@d%%lBd~%uyhJ~Kz3y1fOH&pa)Sc#m%zwiS}~#Sh;TF>fIra?)0}_4Mz>*5`Mm< z?edKqmk(M_nQzB&6Jdh+dUZ#*F*j*EXEn`z)e_s_y2_;T-t63h!orr*P0`1Xr4?2e z6z9R`sjji1rnaHJqWvWq`ORVttV6K7EeqbtV7*ta&BB`vJ6o>~e$OjI`Ex>18` z!{W<{iO-Wr!ca81BA##^D&^#R&KHuKO`RUETf4EUIx;EWbBL7ZIp^@-9X<+8d90_($*pAF-63FCEnzmC^g1u41V;mI^i)$m%n^M_&T@a?C{#_9sn zo`ct#+fVwu?r4sT?Cg02J9+TBr@68~+ln9NwR)X;{SuawlZilR^hlZ(IP(yUSW!p|>U_+Nk z((Y;zrD7Ttc7{uDO*rtt@yhVs2lQM1!^U!Ve-B7l5&RWhBIU!-x()i`dhX5 zmF!+I19f*319fKpC{S;FD^{)pb*cu`xut_mPa2IXtG4U1^12$np2R+Sd!GHK26!)y31XXOF~l&`YM&1;mFeW*K6B1IvxSRokng#A_^n>IZapd| z>^ce9ixSz%ZIewKH{u92cAUrvQw&l{2d9I6Vn%8rp&FzHkwr4jSwpHP7#|x1tblin>oh}OZz~X3kXP!AzBlnF{ctn zn3OFOn4!v9DqH5Pg7n258?U&6^Timyx>9rAjb$THEPA*h3rA8+F~E+uH>5tjV%byV$AXh$*)!;K zl#V8(v$O@Uu{b-&7U}X544IKKyL$QgdAm8oR)-86P)YE6Y;;^kUUcB*dQ3l8<<>PcG}d?2?w^5{ zh@pw~p1G?JZ{=RkDZ*Ka`U@8ht@QL+6})-fmXJI5{>S~BG3dj4C*7|*bNAkZcOvbk zO`18zV7zfaPI;D@0WM(~O);A{&vC~5Rc#Hqd2N-&dGe&X`l=Iq4n)W+YAVXhi%aVo z>Z@z&>&n~z56q9@C9G7vI1SZuSOkW-V4hOuS5tU=X-!;AWC2mQVibit8HJOG!qF0i zxArp%x9C%t3Z+k?p~j$Ai(v&Y ztfUsX2E*rc7)D1b6Pgw>4Hzo?-`a7gc4t&-kxwhHYAz{=OMsaCr5rA5i>&PIe;XWr z=guYKaHgbdIecK>o}Czp1_dIOQLncO+=w-xeVVLQFK=cXZa+tGu`G*TA?CWi?mIW6b+5@${3C7%8%-3+@PUxf*y@qP7TvoOfpSQl#C?R@^RT&c^MfUbrq13 zYg;74jdG2Y{5$;?$%BE1PtgETJWxJVJy1M+f|iKzaOeT|Q2F2=55L8q4Bk`URpViF z2Me~hxjXz_D?E1tjPCF2?rg5FE-T8DL#rMpK^h5k2uQktxd;pE#I@pTZlz*{ik#x1 zmJonU=$n1u06=0sE9B5fq8%_Rr4b{>ix`N`nmy0V+}vUjwLP4i;chau_hL!?!cmnN! zdOg)-&eVYxaEN4xG$*dF5qz;ogSF4ua}hD%7q$$Lb%w$nYc`CzF33|&C}Twlpe9<= z&~cd|w2CnHqB$n4iJ@>5(PR)Do-gH~$RYnn(ecNnD!A28!?o`vR+OF3m~Fmf=`u8> z$?}Cr@1gQEaCdbcPkn0iRuImRX9MOx+6@80G)xw46?iJxC~e0u<4D{S1Eq9&ZJwcbT#Kfx2mHk629)%Pq}H zEAHyq6yUbw*xHcwN2h=I@x`tW6IOb9x@Emr(SP^$2M>w4Le2vN$M)o~)uMvtv&iH(VtgWB0DreNVI zZN5}MX>)QCZcQX-q1T<66?Czh(&kqKJM9$YEBlU6+MIiyrOkZ|*iBksXBLeBb}WD$ z$$%}^7*;n{UzQSQBDUhD>Xu<~f9P!(0HdkSrkZGHr?zG$ljaZ#77em7)y&eaZA!?- z8K#zm6zXPYYEESTRj-*H*%eiO_R2dFu)CWo3Shn)%Tm}8z_xr5*u`wF31Ii0NtEY+ z*I3%n@|v7KNE~JukW>Ac@GFw%VO}4n?psc(VLk$1R3+@Er2l2++yLP z#goZu(bdDpeb$Ze zBj{TX(J<0ig@j)1HGmQ1kh>aE4O*h7Y?tfF@Y08JZ5 zhFH;uFq_h5k`EfAB@J_52*OoBtqQrb2^+)O+o|mbz*hrEC)GA%U)2g09Q|yU&mPOYX6I~r_?_Z1s0k}k zSC-Y(l$O<27q$?uGhyAOOq78AKAyjt`1Mb}0@V9o0cx%fD?c@@0CnalP@f+Lb+H8M z70`ja9Ml7libH$CK)qid)cp+9bx?}u&O~ONnXd&k4j~m5MiZ!2NUVv|trDlTQ^%Kb z8b*!U^?FjDNMpxQdzw=!YFm?&p%%}~#GWRN9f{Kvki^} zfc1ZT&wnR25Ua;zW4WH?);d-P9*EA+u{ue^>Ix03^R%p%T`eY?#;IYOwHED3IgKru z!>k@xd@hMt4TTUo9i$vDEA9Lz%JE@XbKDPizQ4`iLHNEUyLoHqw(`!CJOB6gPj{Yz z)3V#Qe!@Yk+qZA=H&s-j-4JhxH*t3SwlT8nn>TI<*A`#7bpGs_)19r2HRUK@Qxjsy zD)YcT+&8Bj8y#wpb3J?;4PenVL_;eTO&n?NhhBut7YLn0b(OoD3%Vlc3fMrMO*u9) z?3uHsW3*^yv1qXkGEg^+CswXqw|)a3B-;?k!zx|@hhSm7A?)Ju1l}*|Ao3L+3Nqb5 zFh?hZ9OQ8W3VF2>rT-9f`Q>2bg*{I9r*70~CVd^etRU<#rj**!jGt#>#y%h2?|{CK z7DwsE6K&(jXs_Ool4`+i3=m2tw+>FG=#fARvK%`@8elUl|HDRQt%i6;4Kc|QIwgxu ze4@6^B})Y_hH;-gJs3K0(NdMlxs>;G9g*Y{_|0_{^zpYe!bSm*%QGC>2D2UTD+rAc0 zef@P)X=1G?CW>NPV(M4pMa|2P6B93%kCu^_nx)`S-NsdJ-nJ)CPeo3hO7J)?Il!}ftQTTz{SFGc?t4@279_%Vt#eU z#XEOz?n;vv@6R2Tinr5JXH!v?j_&O#Bq{$2srW5z>!if*<*9h@nbdZjbxPwIqPwiA zT-o|l%b2{h(Rg3~CS6a`q~aR9U#+fSsdz~l;a%)ge6GcN?0PNU^U4}qiV9gO-jJh$ zp!^i!JsI*6t)RRyqp4nZ9`99x^1tZ>CO_Qz0hOBiCT>4nzcGY1+ml=00pg0AKi_(a zAHTuP8`qy-L3 z%Ej(~O!x_O(RT0Hx>?w09E<_D1?I-O(Mt8swf2k$04Q)XFIR7 zqzO3+c3xpeKrUSvK>nvS$1ZM#`C_#dXQ{@qjXzoN0KW4ZI+0o|*bK$b+tFc|`K}3`HZF@DQ7x@=*%EMM`3cBoP)8^$+5BV@u&aK z!2kJ=KgI;l`R&IS?>x@&TIuK3_(kWrTh~5&zx1G0;DxA}oG@XzjGJL#GIb_rF=njA zcuqDqaN%^$V7vimvS{)=TXV}u?m&8GN@8qrWd%MTWUQGD3UOTGUn)hh@Ebxt58}^i z`$qh#{}dyB<_}`&A3^-9r^F|j6TbbLz5FCosjU2=;-4Zv`WKO37aJXwCLv$Zz&En4 zOXo21b5rT!QkGZguR#7A4EZ^rnbCa{XX5_ zxT(+lx9}^zbE~dVZoc6a34P~urM%D3ED$x3s{EzRa;@w7cLl?^AGrRZRkl^V6}M^#%5u|=_O>=i0$WTWnrUdL zud7woOs=h~YiMk0hK~MJ*J;SiRlQ0)2K%0$RYPg6IwSN9bq}3Zbn&OeE|J9Or&OnY z=u~!m58b&ju2wZQ)CsjF>|?aFK5ygO6>UF5jxKZ>bhNh%Z9=QqCbU0o6I;a=u~~#R z{TtXBa1BBuJwF~6@>P|URWO zO_j%S#lqIoH%z`OX!FjHjc=Zaij9hi$*leI$3Oq>)B7<_?|g9m(ZdY4)$YrR9(Q$L z|KLj3(e3NjTX18I4LK9jX`Jb63(Y6IHkQM<(A35o9ch7^YcgleDnEx=b_>UttaY~Z zK9LchQB@7^iqf2BBHa&_-~OfTTafM%FV1;%=9^Pu+g~Kom5Ru4LApvLy;sLS{#tsu zGV|(_7joO$9LjBf3X^qb>(blQl3z$~E1M+N$+J|&I@Z;csfs36&{@#fOr#*hIt8^Y zUXtAYl=UoI78;A>RwCWSQoZChM@Kr1MG0iE)U^l)>B8zH(iv2D^{82HE6oF0*J3p2 z{BZXoGJN{hNR1%+?1a7|!bhWkBS&`?8PQMR>sYf@@cQusf zWk?O?SAp($7?c^qor?#zag;cItxXJ%_IJb3}b5np7ij#hvEwQd+f!xP_@(ZKZmg|^CAMY1 zLt=ZUkVwZ}9Kf#RiWgE_#=3L4mDfk7w#|i%b%hC|S+{yWT^Jh0x|({H+7`3aR#u|N zx>gT5FhLeml}S3*m1HVw$0Z~sC*i^zDW@d^*%o<0%V_EJNZXPTsJo&?9pA~;Xs{V0 zGVF}i(5|kwR$U|3PO7Vio)2;wbk|Q~Dk=1cXMXBc_K9azeL^qYz*8~cJw2uFRCcO6 zl%1&Cuw3(`UEOBX3e|T#Uu()fMoTN0rD*+gn+O(i?L3&pwW`{lw+byr%}q^>Si>1= zy-_P`XLaGujA|g zzdEsg5Dx*5akbJ1X~Y0Qg)ff-=f<-QPL^yAb8b)Ne9NWQP$Mt(^$D`@^<25H=m7S9 zl8)u4BxlFO#AlVg6?Xh!Tx>)FYoJwy*hSNYBT2KKo6UlUsmW@fV#vHxu^l-V+?KeBy*@+_(wc)J0>= z=T5}`XJg{V&7ID1Q%t!rrW5C4z~|0!u2>XB!Z>Z^zWCzO@{-bGiF4mRzS{qlj&rBP z%x?<`Z>Zr%aBhN@bK(#0r#^WhqwCH2_pm>Y0$sujpc{z!IaVFV>iEi10$pmlJWUUD zrNf|0!;fYJ=mea&XH~o+;|Z#G2D+$W(Dedzd-s+|Reb6zKo?4&YtVx3^f}cPCEEih z;loQomtI&<8XBESi{Qh`2i+Y_?N&&6O;bsBKAWRa6%Ruus^VEnCl-md3)`|HtGc^B z0O=my0O`s`k#1v9pbFB51=@^mB?tg!;{!VtfNZtC67L&rn@D*s&(zOK5NNv?<*j>au(b``F zJ2(+)61%EQ1qp|xHZ2K<#q6=I@*N%da}M*_6XKp)Ur;E-+o1>*dc50 zP$5ea+boDD$nKEb)l^p_lc=e!t#1Hxk>GWb2&0ET!}SiH5qbyu)V%`IJ2h<@cB@Z6 zLy9Nhke{Mc-T8MAPXO`6He+dngs(9I@|s%&@NKYFflLj)@hr6yK|X7bC78OhO#<7GHv~0#X2`~_SvNlr<1nUPIhU%4d z&+0j3c|Rk|Q`M=#z_B$|6%~~=_05#%X#hyR)(%u_+vowXc(R?Hm5sB#9ZncHxVUUS zxN*n6^sULUDfp$1ijK(3I}mdyA~HTEF+M3d4eRufB^8yFmQ|G2oGF z7ypgxHihgya`<>^hP?67@84@oe?O${g9o2|nP%nf;gkMZ)2)c$*AK08UFSIqTXBXH z3{2-tooQj?YB_e2$=GqGQ@Baocy5}*BF@a+-p|MiV41JF7P_&|w@;xE(S&~AV?4`0~uV;fU+0!tvLnr=1 zvKNUP@DukRrcP#GeooGoEtOcAP?Q^25(INtD>Ex2lROJF+1?3)V3Q7lmsH616xS5j zhi<5Ds&C<%aDU{ey0%eXk#jP3l$anhDHNq{p0pw@mQE`xugy)0$CN4~vmn2=wx~#- zg0+@enQijOs?%pA3ZCn%AEqF*^tk4$p`aO2a5n^CBPe*fD73iL7wfb7x{ z17K0c9px{jdhI$>3@T|g^g9BTD4h@{bvQKjt1Kn>g={7Dm&O1(DW|gi(%t)qazaCk z@4NuNQx^cgbCq!t{5p~8C8LGe_;1McuI8{z?-DY-=2hBEZzTLK?JT)5oav=A_+66V zSDF-|g`eaAZL%*Mr(!gTUUbEI<^WxXt%)a%Vu_3uwJg!QCe5hYy|sy6Rh5o?O*x8M z$iEUK`4`xSrHSmqjQmzz3sVx~O8(Di_Dhx+-|LmMe><-__v87W&Z*BoIsfz=-~ZjY zf%8M>xbw<$gZ;ue+4*xqzj#jF&tq9yc~;rWpW%_y@jZOE!Rf9p)#O165<0B+O^YeWnr zMN*kzCPjy8aAH#0X!hcB zOkYI`T&UXS&zXf44D=$MmMI-&%be&_;u}LFbIB6yhB%|Tfw~OcP$wKGCLP=&g{5i{ z4Er!_Qp3FOJKX;L0duJ5784*6m^yvVLL0gZi60mA4P=n*4j;$ywC7B~wqBx#?1)Kr z*7i0w%RGJk;rr~fKWw|t*2FhrqEZtwGh$*+=4Kv>J_N6nNc{dJrpYriva<5>3rmo; zRuwLrX}5g+u3h%_R`%X&R{HpF-uwEYu+;RttB(`69P2ar&8=H+f0JS>c#Kc@w5|V0 z@cu0e9A{hd-1Lc)Cd@YMftz>l zwq5XgK}k8f0Y#@7vBmzY8e;#DNW^}Us2oLX?c7PqVK2UH?sN;lX0H7NY#5nu!r`Md z9j^x?hoWBKb)1IRCy3YW`n<*>b36-g8S*osqj}w{&+G74@VX}X<-9I9PP}eWRw>bk zlvQ^tHG?PWLh`qa?v?b%=;InYZFO=Se~)L!-zjO8w%jt}PoiMgKLMGQoPcsVGqa$6 znAVc0z_O*XLta&Ny6;2s5xw5uSznr)k%FvIa)TR&_55L2M-A8J-HGYRaG`~^-4Ok5 z{7#7|&nL6lDhW8znJ+H+;V)_EJvDHlL6FYW8R3MqrWt29byY-;?_0Xu7 zG5b6*yD@4cv%5wyyYm&yzOqfrY@@IG8q>e~6J@Noiul$aT1-k)qDDg7==HFaykY@j zX)HEJ=bh7owqaSx3(&3}hIVB`bFtKkY?q*|)$D5gpEGdag8Gmz`af&jE%c%N*FL`Y zhrTDhs=g*rpBZVd%dCGaeC_73uE#B<3*4PJCkANTOG| zOQnFYO7emems`;u9B%QFFwA@b%-_hbZh_fCOKU6&WAXxhK>#+`R&lGT2S|d6t z1_c2*>WKbhNMr_^dT(6yqJLMAd|{9&xZ!FFsdC}@49S+W=!8j*9nRyEP~I&0aAwS<#NOS36+Kfet8&OL==EcF3K#Bq^3^ zu@O@Ms4xX0S=JCFStQF+EuH{Xz#{Yc_;wap(n7O{d>Qx#ok<#u zfMMk501qK0+?o`aAPMFwvuEa_nGzEuwYgyS+#J&+yq-5#W956Y+1%Hrko!LqlR=|E zHv4WtC%@XFIlVy^X=2^Y?oPExVWxdwc5>X+1k)u(R(J@`frMmXXnO-N6NDf z#U4C7}@_~ki%a;!h zvO>Ch4$QT(Lb^GHfO&WZ%%>KB`Q7&OCAVgVa?gyms<$@v)^rqRmQ-W=cygA@*gnoD z;m)($#{*TR#faputvQTQuNf7MQLopTe%qsm-s(Jc`N}ISmv7)UFUMsrWLZW;o4$a{ zot-Tezj7Vkon~U?8uiOXjV>3$t*lgwLnduR%S1=!#3sAbaPYP zu@||f*?DEsZ3_{kMmyX0$A#|T2*Hy?SFh09z$+)l3XWU!I6H%H@xF}^#KAo)t)+0P7$*lmS z@?cljLkI-_jF5db(%|P5GiGPy*^E!D@=m)dVQCoa4|Wn;#*VU|vJ=`*u*{vtpVRnY z>=&btk8B?txHZJVEfO>#!6z1BSWFQU4S=r1Mj0VPQtBd0n#_iwhi`8?Z9`j6Lo|N)M8S6c&@TE3KqPaB82KeO%Ptt6!fy{XO-X@0sK6PdZ!9IV|(Bw>B}x z;;@Q7Nw`a1Tf)C2V_Npvw_Yl}7 zvaszZux*#Zwue8fg6G3_AF6)Vv02zov!;a*rUk2lKWsl=J_B3c83CbfeP>N;ZWfjX zXKBms4wI#bmR7Dsg`KrSrFkVVZtE7%))9BB`dbdQA362%m75>lLyYH*^SFf0s$h&( zl1$`ZQNjH3YBF2fa-^cXFa)#(ZW-W~Ow^L`LJ};3$DzC1`u3qujvf0~xIMx(Y&zSe z)Tnu%`5Te+R1F~LfoDqxIMdl2De9! zmcqI?!{T<^EN)-raEtErEN)MozXIIe6wJfz$bOI zirZcmx4p8s9bj?WJ%ii*y}h$S_yTyVR(~4fwWTxJ%=Ju@ay_z{I{nvF$uauqG@3{h7>l;yA@LxE56J+7<~EIH z_f$V=cryo>{%L%e_H_#yEAsd4NKW3KoRkG>bD%zjHAT{NOMFb!G zABI*R<9kj7aIEUZJy{Tj%+(qg8sjK8JPL0=9Ku-@90IWx7K+d?Zto2MKgE(TSuYcN>$0B``SF%!5YQ}P-Q1r+cuuv~@n|H| z-V>BL~&uYjm&Z?=1&yCxgUY$75T9lQ~$Bn*_%7nq*Q@{X)@R>VMf$Ds)mG9`23%Eb z)e@qdEljD!log7L8b!%zY>!Fl9bk&BEj>Mae1m-5-Ipy}xhl+KMJjd-s%mS?dS9Sq z1;bJ$+mQt&o3u?<$^IfiLR&z@B*o>0poo@$S_ZP8JmW-I!vUKemkdd+{ z`iYb!)2)!QG0~uF^fn@81t+Q#F1HVLPjw2r6x-)K;dyjz+C%7iLQ2=(Qyg76OPGFD z@zzJ}=LKj`unT5Vyw)_8H)iEv1fT_C_S*$J!P3}FovyyawM`{u6&PHbQ?rxod@BfB zcetP~CFS&)*MIlny$^qP`}+B#{ep%n_zWyz6IsGWvaPYDvU-*!Y;)@y)ulx#AT0i? z!*dV`ig<4Nku`aiup2jRu5J8O^e@!xe7u&I%;Gf~&hUJ^vNl6p0+F-0BU@bAe(2I0 zZ`~SbZpF0I`|rzyH2lZl+2g{inwPdo>3S4&y(X06H8Dm)A~cCJ{MxVJRq<8e_3qu@ z&*<5U72o}BeG+eJGTCvIa$&%#53*vRB%OQ-SH$F=~-s!aZA zlm90=b{cyE8Z2ZTa3%@i!-f(Abt4lz{}DAqOyFtOK~P}r1KMAi^iuHxLaICR#+D)y z6W^ag1_SgS*1{%yo_HHz0+d}jhGZmfdlO?bYXoazNmt@N;WkYk`0he1>`LGmU}+cM zSI6oY`>!7`>#78c6)Bwf>G)w6v9ltHE3>o3&VcP>y9q#+Vu35N(V74+qMs zu_ps{49x9aq^D0*fmp&>z!rn75a#w6Vx0qReC)DSPDuevgWP<){8sq|dU$VHuHkR) zW4GF42frXYgI|`Am4J=kZ69T>Yb?wwE`!%pUsaU5HzeFED98h8HtM>@Hg0x$ng$+A z{llWSZ_lc%Y0Guug-2bwnJzi^@gJ+0^`pP*7V3Jtdb-%?DDo&JIc;sl_5Mx@E{p6} z+L#$B%cF@GoS(m^Bj^a_i{n_b zogX}87O_sAK$gou<2|eXD z#f~)%4oEX`p0PR>nK%_BnZ9r)6X#LO9A@ti3y*v~{Qd9`M;;H0j{I|I>aZAC6%UG_ zRVC1;&-PP&!d|+E>886R-A{YukzmqEceo1hhNv#dOpc4$8WS70Eg>-}IXNjQA%0s7 z0*Mf5$ew0p1L>Bs6qF|e`6Q!&>_L&-8Fv4QT>hIvz5&i^;2DDlK7=DAt<=XQ4}C;2 zAWeXTmXaJ?Qk;<=yaG-H#{Eg47%qDtHWHr!M(u?6GcR(YgM=VxVO!Xq?3|gIksM2B zmtWw%j=76nCtaSoDzcZ9*o&~P3^}I?0V{T8TtwLIV(b}PvCThig=7ZbM$VQjXQ{z< zFflSR!5MBB+D#5pcbbhl!_(i!3J$BX6)toD)-VbXI!}B99CiidVZ>5aPc0`cem0*l zn*dcO%+<-EZ5@3x8_q>0muXQSB%~3ih%Xr&70Gfm*~foL(ke)Lr04{$@Ly{e7Hk@1 zXyfhSnOR>}lwHJ+&P>eNSCaVMe$V=fY<^Wid2LaC?)ErL^1z2PpcFI=jIHf0^%k4h zxH|_#Cnlv=^P6kT7l%b%_|#|ea@)t7>6Sm8DL8N9wq$uwfCEp7QlL~2UF;g<>a|$a zK-Iulk*Auda(CdNr1v zVQ3U_v68H7&+54i&nS5XS?%s~GRaGZ0 zy@Mf!58i#_<+H>4+h+tT?mA!tX9lB7p2KLDrjxSAOoRjHtPn=qbO^>uG>JmV#IyjMdWHpb?5NQZ@#tRP)0`4(1kzF zQ>)jzr>|oIR=R;KHPLp~w>52iO1MPztS3)*IPp=F{`&qeqYb}}CJj4!g9z4`K z$YQj!W4d3x^Z<)d>DVeZZtD-#bPpYrozO?(Z)FLR*YnGz2JFu=;|za3^25;h&_ihI z$45j%%wcNiKK#|OK?);NWY|g4FWFC{Ei`lW_sIq0f4-w23CNd~NKIoy!KZAckEn0RP65e{0w*9NcsUONCM=7s?kbeS#fU z5piA7Z*s7K05&m0R}Ho+(Wb7-(2^vx0OwfAFoF=$RqV#Gm2sn>5pkRv&wI+5ocp7| zRuXGKJ`{-sYYV%SvU!3$f+@@!h^;AGs8$yH7_>lSB&-3Eo7kOkQ)2%jtgUG>M8 z5>TvcJ}~XB%xPH*sMD{ZQblHrDGj_*W+GF@Ol*!`oq?{7w!VqAgY*^%S;az94rdO_ zfwWVyoZaEQ#C@&D3SWOeH*io*!%-!9@P#+VuN^*+I`l^=h23FqYTAHSdm5_Fzw`CTCU)~! zwq)IAUnAF;oZR^I?CrbxIlsx-G$1zNw>gV*L+EgEoP8;Wa8|~3CB8r}I9oI$SF_=| z_RDfsAj{c};4Bl%#4+2H&#|06Cgp4`g2GtN7S7{r{dU6Hmt;6Qg;B9N&VDe^e|kP= zTlg*Q#aV?_BzT5!R*Q|;ttrmTEvsv4#Y`Ak4bVkk&ylJ|;=9&X=X0R_oPd@aKd|pk z>!=V2PF(sO;p{uFUn88YCxcsLtDSHb|7~${)rRG4GHyR-N#$zI$+D{Il5EnM25QM; zPwcP3vbL-H%ALg$hyvM-TzaMo}=-%TJ}Od!iUFQsh%uTl1md6fNxr7Z8xkq1z!Z9NMhi$h8?w>8w8 zdoHjsy8~@UILP+B0J2$q1hVXuC?LyfRjP9ejIAY+29;G@s5(Z*4%c)H4I+?q#uFf( zYb`uinN)RI#{TD_e-4fhK0Ner@G&}9_u;6HAD|A1u?--`F11`wcQ@T5?B;cKiaUN3 zFzsrsEiKKBHD!4zi81tMIZ#y+OU2N!bR7PrjiI+HB5`-)dgLx@MuY_iA}1ZnhCKgq z$`hTMX+ZE92|I+CgcFGa4UC5vuV{A{XM|{BFw8`3w8+Ga7^RprK=&NyI%$8B0WLKG z$mt)5Qwp+l!uuz$#b^~dkaKbDC>h@UY&w^^3m}SnMR?h}fUFb1DCPx_x;5?snMuYA zfI$kWFyv|n~X&XM8*Maw99~R^ulbdt;J|kDHF4os8@N?N}%ENDiS|{+ylj3E%`;p!f08Sb#u*>kPy zlBMD9jw_ZJxjT56d!(0@_GL!KZ%=XgU6OG3$!+U)?A*I!>q-~j<&It@d24hv zR8-Y}{Q?CR_5<>>2!Ge_QjenH8d6{-79rX~yl zuw(eL`xfq)wjcWj8wtN;@v4&m+07e88-96C$&M9@ig@KSgw4i~KwmQh3wQYMzs+w05RKsnG>^5>c;D*H%a1DW8=;>ZQgvj{X`w7 zV`unUol`Aq2h=AMzMgrGuah^$M8{sfGths&Yo3m6Dz0zM<<3;d@D&%L^UKMO=?q`7 zjaS=(Q~~gnEF?h4vV0XGF~+_xt*xwF@WvbOeee-W*E2_OCc3JO+-hDxSI_6@T5+O%45F~CVfQO3h zKK{x(XH)Zv1!p=s=84!(Zcbm-TzBN?3|{#cuZXVlE_4F0CrVhrzI1_;u{{d_dr~T6 z^D2@b&dJ!a8+U(tH1?49?qLA-aCdvjd=j>3l@LY3Bs=2Eb zvR=TC2dU2Sga14*j-^ccfP8afd+*qR$Jk!F5Aph}j{;TUC;?H-0OU%;CFior+920@1^lNEe&!3P+}@DxT9KsMyFnp;}ivED0&vRo#dMV46ip(v>Srz;xN*b=IJeio~QV``y_PCfmpTz1|k&OtTow6q15(bm(7BviR85kIu zl2I|5yIO>k*R-1=78@|ACd8zG*g^>rIJh+JsQ~B_(5v8g0(PO;B^F;2J!>w;2Lt8` zO^CKt18^7PKsDyUTwxQtt3eAROo>?3F7i$&2B-pPv&kTLz4;RFK>t9~P*3+Ddq=%6 z7jFY|BL@IFFn9a56&tGy(#m)2NQzvNY5Yb0?xkMQVF6w)?k=`oF;)CMTkVz96_pkl zn;9Ay8=4tuXfC!~o0O7YRo9wqYag|uW9QUm!Dn%zgfCvtpK9Cn*~v>UFIU29tem3m zB5hL>SkwCIs=8{6^f9(&6tcUT(p<9K#mU>(%fZuYMOe7cx(&;=q*PuzmHhU#^iyw4 zGZH@4A!bx25Ux1U!LRrWG8eCRNEr1`EBO5r4D&+|qF-o+*Lr7);oZ6Z8*ok#ZD3x& z=1FXd$*?&O$C0Z0x^VotYic2yJ7v&(tl)Vx3#I#FGiXlc(0p7L&4%@L)w%P~T$f1D zd`^hCUz29t0Y7>>-R=aCu9|Mjgo+3anJ2?$?I-9j6&ho2jor7N+zoxOcM zWv%77cC?VobiZAmpsf7pTd&{!@FQ%*zIOG@P#=fo?DT&F%dN-GojrN9hD;`KfqnRI zxNm>=E1!RU^yvQ|EGKQ7b!f$*)~rLzs$Q52Y%eS$r?9N`(3Q6?ZY|9#t650p-_KI{ z6cN4rvxLeQWvF~YN@c-wRK{Ev9NN6jJF-apwl()+ZB?xwoMT|z*af;CGE=ypmVVuyt%o5z|&xK66u zSdR>%^5X2>aa%TS*ci2GGw4jmFk6{uRg%WIaU+6r5w)^-?fMNH)`o?ItX{hoq8Qea z8s@(6-XV+7-jkrH*h>!nf&_AJ3ea){S;@s`_zgtI!Vkqf0%?|E9Kn!8BqDapg$&|~ z$?dZxLfF1!)&RFJfoNj=Vs_O79;hdzwITip&(<2s+QgLog=D0F%oO128%bUfqcQdj z69y9e`Og5f*hv-IlSQeaA+ua1qfo|dw|lj;|TGQ z`W6<3)&^<@I{F9^pfs&*&0U;T%nS_89PG?A&D<;~eH~ZI*wo3yNZn|?pQ)XRxusP| zT19DFS<+eyN>NT;-N@WnPv69Fk&2v(+xneZ#Z|4{dA3GTwi`Sf*RPFQ?&;*~9aOW? zDEE>2YVQHHpK-p|-Gpi7^4?JmXBHX6BXD^qzX{o!4$Ov~-ba zg=dJ@tY_Gh68|yy*`F3b`uIga`jUW1XFe;PhhO5PbK{ZWc@FT&bLS^6DZegAOB+6Y z{tsWU0}D!DoNG!OdhOvOmeYeHL-K=7h4aO8)ZQZYwgka+b0>%CqxHu*OjjNWp6#T4 zdQ6JxR2fY7Jdf$>nF-w1y2hiw9nmrm)4lRF-yLk8=)K<~*V5B7-t(|mwWt10P0iD% zKOStK==r&KvS*}w9Cj}Se?ka2jV_&}iD_h-=*H0os*!GD8g!AeUxUTr z%-yk@h;H79e*jy=(aaX!<|uljF}z@$h71b}4O_h?A~Y~yW!RcXEVyCjYY`SG&{_>3 z7BPwG5qVC4)I9P=C(tHt29243MQolGjvIq)7#}mD4Hp^B@EVh~km6!rF>5PNqM?S} zF~(~grY;*Vj!&@&ttvZ^+SnM*GK}SEsAvgm_A+R+k?{nHlhE-g!LXAm8Pz4tJr~Go z%0Xh!b8wt?Qih@?^9!tnA-0~df`rD7!jzS|1*`=ml$+u6ve0Lcf~!IfF|&s?L@*>6 zf@!ia=b;GE41%NI2EQBHS!6zDrfB@b$jA@IwArXRZ6-2ejA;|fRBXZ+%fSc{8>^!u zXi82=>*$-B(+}vMFm|iI0Q7XNX6@+Q4<; z!S0?;&Q4a2etu^5=0=8!T3XJFd9iz(0zE7(UCnjY#b`P#kIBcSuKLER?aPhjDFsDM zV+-TO>dFd;wKa`M*qvKf**BQ(VQKET)g4#3O^h`i^p>Iq=xD23=`FXCQ&3e_Q&Ui; zDR;R=h%LuqAWBt*TC_CNR(+|zx4VzKw})TA3R6mBO~!_0VGfSAu5Q-0E-tY^b*oUq zsD5zcyr#1>_{f}QGc@81@mFG!5)utf>^6qLf*!ycF=T*mZD9@Lw?B7Ot z%{GGai&B)oH1+b-b)j?>nV|goK!5*ylvfuuwc`{8LHV=R@1!WNEz8a+uEvEmE|5X5 z6M+nE)v%Yr@+!{%Sjh6Wq0@xr=Rdgj(T8{62Fnlkw$>r;3Rn74Fkc(TSA9dXJfWzSRRg32E=9NV4et{ zJ3YIwylv>}n{UT89B$u^iHP|u|9n2nOAZs3UzTC{VJXY2q%6nT3M8ux4xBuDmSuTd zTJ5kb%QFtV_VDLNPoTL6?+?i>L^(MVM8b1fl($P!UUz~+c~yVx9LnF7qC92><-G?6 zdunGDw<;UTfD=wLC~vN-KK|Rw6!TEtrC2%sV60+5k^2$_4VQ%U$td?p?%D$uge4f*Wn698Enk9nGor@z^)MbhGuDe}Lo$hm z7(`BkV}lL*!4&q`P#HY*-Dc5_$VMVziR0lk4Y^HPd81OgOB_WGqmF7$&TvTxgq;C* zCDPl&5`_@rTZI+h)+|QJDg^OG9um0YnkT1{S)~r+1u9$xUoH5KpG>BDMdr$gcqgYm z-Id5^2H|WLF|BW6WhHu` zNYMV^f#fG;XYxXU)F*Qpkoq*fnmM?yNm{-kaC20slV!|`6{|uv2YQC2>`Gs~K6-Ci z`o6l@lueOoNiq3lTb6tItqD%_4+%?4*q&LyuWGF+E81zTqd_SuFEX+)S)?GLG~_+j z#HSTj)$|;zHg|S(uSDxSHZU@5TjI8;J=hEq~bUcUCmhoJm>Z{50ldXDmBi$aF-?o!H=T{Uj*t)-=|qG{L3D_w%K7jL~* z)Y^Oc!bLtk@6q^>ng|eTMR6cLWnx$lc*6Z-ey>sbnV( zY%FoR_hmq`_nmqD-I&VE%$_$pp3W2OpK*{se(ELGRVnE|1;}4%pA+ndhdIH{KQgR! z>^M>vW+8v_!X#1bQH_GL$qjRgJ)`sGhmRlq@{sr5K|=ZbS-~y|kp!!)-_4z~U@6~r zfelqW-F#9i*!xmuD9?P#K|VJO8*`+a*w@?EG1M^&d8Hb5!nlgArpV-5y=qgJ;OM{$ zHaO5t5cDeFzTc`$6yL|chcsbqvNT5;m7QRzP=HqtFek-QrXZ-Hnr7T z>Z+?7T3Z^b%BmVAt-=;bvk(%0szHo;K-Z4eNUG^7rkbwNsjjN5tSB!n&Q0CE1nh85F$If7$XCmMam(8%%aRAp5zxz*#lY zwIIx7OyEQ8CL%pLvYX+$2&l#o2I)i^8S3lm(mHB-hQ^qYgHz*9#^=aro)@;>(0Zgi z#2#aKHR$7JG?FTy_f5V zZfvflq=cOh*SO8;`|_(>4h->Kt*tj_rbQ=gkIIPMv?n|^VA--gnGsu)V=;Rtr>3bW zM=7eP2q}9-EgS>&a`JY^vW%CvXW;TcUmX?K)SX+yB7@fj`GXpd>WFo4Lny5Wj{|c=b~@dy=`Uh#y8tknlBYmgM;;D zxEEN1YEUFw4aiIh?3>zyb+=PeUcY(eHrDx23~pXJb%-2qW+gw0K>}9{))2|B6S)yX z(8*k|t#qMJ(qVA)*u8sizjfnAclVjI|C?GcAX^KHh~l4L3q+wd#JwT5c1EGz~^pS?A-{P3Bskh$?Myvj#hb|HrRA zlvGG6c@^b!nRaP$LDs&cP3v&-f>Zvg#c0&$lWTCW7APH4Wp3}ycW3abTn6$OiheOMvP(SYmpZO%A&pz4%ykG zT!>s2xnfhs`KO;8$SVhb`&95P8SW-~G&0ptFwfRl%jg{!?27Psv! z-K0Xq)}^WuB&2izu6R5M=3QOZ7Xdhb$NLeowdn3 zGINTnTDlLWyDyDO&fc*lCNVNCe&4RRgtd{IwwLmg6H`*8rqE(VHFX7DO%-_^MM_?k z3SJ%?wJ*xv$z!R9{}SBU(>C9ey~RHwD=WQ#zb7Sh&4y(3P`??LFw_GvpLb^h?oh{r z6Jj)2HHaDX!X!X0`pby%iZnYy#3;!I(+fm?;=NNZP1k3kF%4Awx2pNkoQZ99#POuNM~|y>J&# zhkGCV?oGB_;CA$j%7y#Fa?yl%!S23(60LpoILY=tcb=;ktV1;Ob|BY$FfhaBu#>mL z<;#~YUO0d5Ebh&pI7Zz5*?NJkJAP3o$ejVK;kM9=KO=HdCV(PYJ zoGDiQwxO=^$@m$xpC+138b1I2(;r{1!$YF->W^uXy9@4~we>pTE~pQY}HjpzFw z%273_Qkt(-Qk0*$H*wQCazTjF!*U_AzLggNvW{K6b){B= ziclaFEMX|QqUNDE;WwqRKPfE`lcqf5tnm?E0!AC3nkkXWU}ladiNs3H8i%||T|jlC z%{0;C)z!lT#lhMBrw8^D{2f7MKpy~=fm9uo28N7hB8f_DDN`4+H+n>`TH$GJYi)01 z@9k-8ZtZJlWolyJ?X)5^CdhK_&W%Bl$&qn;wLa$t{h8nfGePeNS!-qhXkJCZW?1eYfy7RSfN#O1Em zzzHTb9eGMw83#Dzv?P>GN_=!&bV$HT2P1nQcVBlqKc8hGaT_Ay_LL^%W+wak2ivYi zSs4Bc%}^6~M4)vre3$v5M#5;LC!2gCp9OjOgG45{_lEQH4Rb~wC z5+-*Jp?q}wz}&s?oVC>U+DvIUELxB8$)bYaDhvbC!chNQVHiSTC?SO*k1Gt(=TI2> zpDzrP+_}ArH7E>Q)nZCgN%!EU;E=R1)XWry`My%+W)y~EnZiK22f|m#jE>T)XAd9j zKQg~CG^*hxQN|@OvF!uyB~h85Sx_+>3ZjQlkg`&|Bx>vGUQ`$|hU<$3M=yNH7KV3k zzjE>9U^fawDFi)P#z~0VN~Y7zG#^>ZyY1G5LQE zmekSpBXx2GV`I#i%E(}8T^+t#K-Z1oCrpho1@Vd{>rG%L4}O2Os`mE% z%eVj9SJwUQ?e1^iDk*;J+umBb&Z?^Civvi8Xnyl}N#40H8qfddvFg$jpTGM-0srbp z8EN^Yu#u*!8I%L6N?a+f5SB|&4yO4`3C;hdgeg`pD#U+P*=f7BZCnedP=TC9jTEi3 zWUuO>lMMd|fg>vdaKX#p*VD^yMPT4^#2+B&Q-TlPvgNeDXay6%tkh-~-u;)Mxy)7v zJR*buIL<`7h|mHcHG<6FsIkrs3?lZ;+hno=@ zu_05LCTu&|221f|A_s2;Avv++$a8WOIZfd3(lhiNB=#eA^6b4O98Yz0Q05AQwaqhI zdGu^C!NXW0_YS&WWd0P`*MO^}tD|dRg1X>?TJ$|O6GUn`2K`h9qj|tD{Gx3Q0XW7~KhWD8fZ6d-{rmEq{h#`KVIaxwt5Kf{% ziUod#8CG(4#Gl}S!XDHn8~k`h&=zu*GGTkMfyY!CYTZ5K(?DN_jy(uWhFK}N_Oz3KB4_{XmTSGf@7qd-~nVNBFyOa0q-CJI^ zYXzn)vGlI3rKw<|qp3>ixW#4^r{@)v)^wJoS4QnA*qE1^nw^-kvoIk!E;Y8Ip&%x9 z-JaC^_8n>%m`4zlsv^acQ&v(5E7+DC6P~y=G+}4Bj+L>kjq?)Ul^ZsNZrU)>q_V zy9tq6+|eMoq}eC@X$5{=wLg2V+% zPiYghh;UHZ77q#5c_Q_K?Ka0J?@GaZRQLHe-`!hYE;xDa!XGD}>q2ZgdsNzmIDB+J zah}+M@kT2ke%?+K1# z^j^6+XTfVCVn;4}^aK@yX;I}~6W7m5D+c`i1r?*~*j&XZYnE0F!PyD+=n2UwtL6#@ z?zIk7cmC?plZJ-p+^1S9Z*olTqngqmYvuCB#^^ESU*0LG#P{-k!4IKSAx=={{CuN>FsZOkp@>?a_zkm9LXs!Ey$_6_gX>o z*_yKE&(7TXFt6~#dw>4si|$goN{kvIs-Vk-WmBaLUsCe4c(O=RtY1`EP>`ROo0YO7 z4pkx?our60KvH>{wq=LG@z8uUXC=7DO?qAa*ik})GdG<4Ug!h%lGfadU8jOq>pzmOg(tsP~5?%~M<+DP?Z|NJA~J+Z3K^+9WV;KI1oj9YmsrR=Bl2D9(~_1(Es1v7 z7`AdtVuw9bCC%vF>DZ3XY3=Rl%#T7yY0S>V_;oRnS(~?S*qXAnHX&})_PqtE z1*xf#ctcRC6wdQ(bADL9UG1T2RG;WoDP(=oQ&VBOi@AbZ91dU}gmbVt76X4APFg6^)#PEnU)Gc2M8ViA=W z&g(FjZvfe=ewFO|LG})o?9Cv1t?Jq8=Im^C9(0!M4Rz(&*|S4LbjKn@s5t6refa)6Z(P4{VgMIf$xDFCs(umK)3fr5&{6omOm=eE zAc7-16-I~4Lp(;(>x@{JXlpF43Z>wdRB6}uB_7mjJT=zn<-(bm} z9~QTO?7c&s9N7a`g@q?nHO!J-o;(F451&4I^blk}PRQP}knG{xb8tG4eGANy{mKm4 z8=fQk;W@JNn`X#<{8_&ex3UU(jfX&;TEid`!4J>B@Uk!_aNbLxipriClYe+AuY9CR zE_-ZDJf`@!N_?CB3w{J#&j#1uDXAPA%N?t-EFb#*GE79WBFpdl`zK}iQ+~-C-*&?X zs;K_tR54wtTv6Wl=f8biRe&Br-fQn=zxqK|_2-|r7QTNEUuU_vTvR3j(M2V^;*!Z? zrid;aFPO}y3z&S3yxg3e?5y-XNipjq!st+WLU(d(+msXkY^T6~Wnh4xr@MzQmRbG0 zu{K4KY?38Y7~L0<$ZfxA95Ya5nNFM`G!BIDafqFQ^QV;a6uzb5;V_6aC9x?cz&oA* zFlKbLwHGhe*3mOW|JVi-LXN;G2@f!29d)Aqk@!VA(m6Ck0LJDUby(R04BszM4!L^RRa|qL_t#fpIlG zLK#SmMJCh6>MZ4fdBS-bd$i_epu9e2Y1It$b+mO1h#7^7!Jy_bE^J4fW*5iEwOB`a z^7-cx-q|=Ne7(6{xSyTNs^y!v?e$+BAF(uI{SJQQzIE9K@B6N<8e3l!^QT16=TT`0$_cSbt+LE*>B%7bU zHh)XNuCyH+;-d1S^Aopht1sSR=C%LCnbH1Ud)7v-4-5~D zTAdUcye>34!X+#uY01u{U2$2Pi?%<7^1t$!;hh+P!Rg9lcp;OHWbm`2)9U!Nfei zmle(9d)Yehy=izFM-b%pbIP5YAR@}W`ykxx2pBR(rUxAtfuX^Zd<^A>2Q_`_AhxpJ(}AA;b4gQR_LU zXI8nVXM^t*|1RH|Thpv^_r-h&OVJ8{Rp%)-j<^KYNIRaz=I z+tKm7aL+u)3U?OoO*o1$Pq<$_KXqB@(y7|8O$+#ro!8FEOT2@_5`V>2Df?f&d-qGJ zbeA7IBe*JhI6(maS@#J7__l?B4@>6G*l^PQ92W$8{S2E*px9K?e)-*Z|2WeMU`~?* zS=vM0&qJOWe1=Ol3haWGl=1b4Yg_w|?C)fcB22VMFWHo#4x<$!O)7jW+Y6|mvL;65 zA70EU9jTDZ8XXmnD*mk;-)8-SADJ3uvY1iDcZ$kKN3+K&6iN?&f2l-VpomCD0*7R0P9ckM7g}YTuC02tDcjcot2TgJ286Q>M%M)A(TAAL=p6AGnVjdf;Y7J z%9SgYc(}Ux;Fi`BFSzyO$P6O1$V~-oW#O6tnE>)-Phl@2nL;GykByrpxJQHw!MzY& zSPXdr^%Oe05<3mfPGJX%bhPQkDmtWnOqOgH0p}n+2`#{UjkyVJqz1@i^%V>xe#|sy z<~#)CMGljY;P+X`1DetaQj`#@32S-6cp(r^wqiw4?oUlMunerHi{FU61(513u~|$g zZv**Gd>wd6CZIcwj|me6Q?iz&3%KJ}H|av-JH*<-rkTWe%81gZ?<-cJA8b@j-^ZUA zO&bf1oDA;YH;{ISA>)xKV`?;VU*8bjX#BRihH8%amVoDvH<^xkg$Z+;Y)osM6Kv zToTrYTZhH%4h`S4cYC;(KGp`5kZGXow0xDhlAP<7M zy{vQ|)k`Bm^;VYZ^85SFT$_4%k~Q#2sQ2?&uTZV6uEy+tofPXNT84}8DkTwKT=an! ziIyn^*K4uSE6a5@TBgmp_F(;SBq0u;yG5}6!FzXrb=)Fru9=5*>y zW5~#09Ve>7Em*FvjU@9xQQ&&guGAcUSHKZ!Ln zqS~8furB^e{Ab>k^V64^ONysj!`8}j9ew8d_C6V|x4(LGKG&xoPCt4GuJ@k=*A)dU z*KzVidYVx!B$-^gnGxm#%%bGb_ZN%G`25nM)~~**E#wRS{zi88oxclk4>$MCo4Jxw_3Af< zaxxD8slBK;{{!*g)c@S|(e?DKLw{^W@bPSBm@eIK$0O>kpgN;-@ybQ24z~FVjIFP2qiwGa> z6SOLFd3bU}NMdmM#@N*&v0uy2r{MYRbOHbMv8@_Itk7w$dP}A6*;STGJgBE$j zCKTnyt=s79fTIhPnvw!f*)J%-ToDT1G`T1uGO@a;de2_psQeAvclf&OTAjCJ<(8Em z0eZyKBincFmaOGP$BH5s5PmdYSRf_5fLQJgI9>+A*Or6u-6Tap z?qCJ3P4X(brGU?G-~jL6HV^PKj{B3k2`uXJF7QQbd280vQF5EQ3MCoxd0kB%tT)3^ z9_um~$(Iee;jdX45z#XR=?=)BzQ(!k+~o%OvjSGT_sx1U<*KbsWzw8RqTOGZAEw^f z(>GYt$-3^<$mwh2k$4*k=eoNSZ>FK4<7jH?rQ`QL<}m;EYuC<^lasTUPez{>SyD2X zhvAK=#D7=4i;>Vn-I{uldOtI7fTv5))(qdB#XQcZ?MzNUN~F}CnZ}hXTq9gdqB&7aQ%%|mh|VY zu%z$a9~M3|taTIzbI3pu&R`B4s_#1i1>ZdY1s_%}xOM&yvkJbVTyS;bq2$p|59R;k z@F_z2PIi=ske)l7qneae-Z%^Tj$=~La{|7tRB-vs@Bc7OO_5O^-lbDC(#97r!2C-m zMW^LY;Tj2&Z?N%2I<{!pvZQb5Z)iR?uVIU1u?ntXD@|{lM|wV$Ha#l;eQ#FD4}7__ z(NShp<$iAtpO5dR{em9^>(i7+|CW(=Z}iW3V|)v=YA+TP_uOo#`|?luJ5sVTe*d?Q zj=z13Us2Tb`~G}Mi5dUi2c`LMeq366syJic?xY*@+)_X>-Oi$q02$oJ{| zXL-C_0DdwHE>RYfNo7egQB%^DQ}=G)ws~!M2pyyp91=>DJh>`r%Ca8YUvSo!uUN6n z$JN=zbIG!0zPN(N-goq#BuC3Iz|SDAY>GV?rod7kP244_WE~jyA6=c<`Ai9B^&wvY zG>P39gtr*+;k30n8S+QRbn#*>t;IkgRs&4UiHBpLZ-Dy}*0z|Qw^Jljn;7aRqx238 zC{I3UrwLf_Qz#oh+fI?(TmY0JemYx3px@aGWLUdmc~6t1MmX_8c<5@zg!a06q(Mw0 z##~~fL2%DWc_{g3aN(cgL!R8XU>tc4Y!{byP_$=lBZ)C>Br@dbe=5E&|7m6Am*V@p zPxZ%)6pZ!n-`5uzQ>?#Z2)rARDz;b~BRp34>QE@GA3U((TCqyVQnz^Uz)EPZNeT$- z{mfJEf&Aozje*W~cFWgz#%|mm>Ah#Am%sDcgs=^678{~`0|K^f+!~`%2%!|(u}%d zny%--PQ*LwxgV+Ps7OuiJx+gY0aNDv-@WzfwX??#u&0EH>%Mo_|8uUFLcV9F?giJ$ zO`b^Bb)ODp*n?Rn?9c|bMYn8?-?1;Nq~Y+5-zC>{3TiH0_~Wlb{n#wjLm$uz1nOki z^3S|;SA>`8ON!kc&r$toeK$+>K0@`H1ynD+`Zb7t{4^nYH#^NQL-d49+~%2)?&U}4 z6TM7uNrvc`IijDO%QfdW9XfLH6e0SN^HQR7EmbMe+ZyVQvtf}_v-f#wEBOUEa|hAp z5xtPwCmNN1d?PjY`$D;WqoeYpAEe~ch4T3BzF!K(`=}d|QD&d=H$}O{k4KN>j1{UC zz?sR*zxm^tOFu~-Ykk|*_2);AzG}}YD9k?nL4LlZ&^V{|!@qv>QFG?0KOfA?&&zo2 zgY=x7>wo#?UUL?mFU*_D73YYvr?PmN8Ip8SnlPPClcZ0lQK@u_%D%n35@R+*gapxn z@~eV^f<+-XL?2{AZv3nuZBjqDF@Bydj!qsvetzEW*hu2J6N8KMuo*#ZSr-BaB^Lh6}-;P!*Z?Vij66|;=(QM z+@j2E9rP&5kGI%~QgYC;a}M+}vRmq6piE}-jop^{nBttUx|;W{hQO5(KKdG74pBO0 zZq8dBUA?z03AS?zidf>R?`7lQ7rbWqvM3Li^cZJLmvDCvi-6VfD(X6muUvoo6&-5$ zc1+19HA|W{tbJ=Je#d4_O=F$@SHpGm^fX-}UVv_5y!J}ZO$UR9(~gV2rmi+!UqM@z0(lq$7UeTW$Da_^KMR@1LBP(sts*<8O7v+ zCF`tn^OGdxtfGD<RhAQiS3;J{zbSa@t%tPY2iH&VUw(@w5I@U7yszy!h!51a zT!b{=-wB8ZXS5^lmq_!6V$9gLx8FWmPcZ&BmbToPZL#M#fox`y84FJ z_LgIVzui2Y$MAe=kNAn)R|Og0<;(4P@{`=*)I3SP{GKOI_WYF3OSw)zVfHAcWTkxh z; ztlX^BT|4(?hJjJpx0<7eqD z_0@639mcf8{%1RK!G{o>oC22E%3&Xhwvq?TOcom%5I+PjdomznW@&{?Gq9VD{KYQ< z@+pU>@L7mC@eKGE+K$?cfx}{aO2kvL@D@XPtFZ8fq&Ar{9Yw{%4x%fKx26))`1i7us^|arb8@VEW zMQr4%kR2;rZ7f5KJXZwyxJNC=Hk-Dxu7RG~8*l397UyV2yj@lNeqr$KCM^qVT|Lc^ zH(ND~brxy)FaIrUC$5*Q=B?WzjG)-Ood3*zg!x5s3Vv2`pO9iZhnOjuz&3B-f5&ar z>iCumue3Kd#w3WswN`Jy`+t3Nc6xd)xZS{UyMah=mfP4NsKG=!*@|y&X)O$q;r8Kw z#qEZ2)rR(*Z1(anxcxmh%h*s?nVU^!8Kto~8l7Ez2RdteVDZl4PUe{TSl=gS+p(dF#rVqy4x+3~=MWPpI$s=UkQlA-E;CsGA(Rm(K5rzSvcfK{uOI zi8V`6*kq_AOcE|xZOEPz+7g$%C$p&j$gT5d@`?n_9UZs+1-Xf#B1`TwGvpRsmRwTo zYn~(ban4jZSl7goyL|z=?znUu6_N^YmHY!7xleKAuJ~1Q zvr+B*#zRLg5poZM+{#U-ak>rUCM{8ryS}--_2{A5mgtMuX@8OJiRMzf=qK_&9@>}v zk6gK3f6b@TMY;03o;=z0AXj7Wb$pwan*ZIC$2D0$=F+gbMfjj|6mqlDGqQ!i@#E~L zS>jAlhB#fACP`uTF?&V(n3SjZVD|C$?xA-t+O>V#mUUr4X!&5KbJZ$g5QBwR6LyS+ zj2-&=A^*(X$-&Xhd&v?{H%t&R;4cj><2(g!S(4n}X)qZ&TjHsRyfY|jiJz(uvBhDD z6G6?x@CJ)L5yUb_W@1_+Slvnpm@c-2#Y~J5q<5j&i760HBl8e11B}DrCJqRw{K$UN zZVGC96yd)(BK3wHALr&$M5aXeag8N+8rjG@Fxo(#~?Q2z=zS!ZlGZlK^g9ISUya$oVHe#kH}zIldvKi^l? z)kl;tnNP71*=pEX!uWvUVr6S%ivBD!B4=ieuOD9@40>B-ct zC($dA$%2N&7r?!hteM5rfms_sdWM-YV*2QUeYSFfw)Z|#- zRqHn_Gtt%8qE=aJFIiRf{=IWZ6}J!PsW`YTPxOci57V`=4zu-L>E`Whw#IE^YUPfC zKZM&bY54>%t*cSjaXGh`RKRre06(^v4%qT zYmu57I!bE0Lten;%e_QSKgp7-PD1-cK5Pw)wbgPPnw!a4q8GsV7BYf~re@)sMKtw+ zIZe&GepS?_)zL|0bwM>Jt0OU9K4Xb6$K?-So-;)j)gK*fJC~cgeM4B_%H_V>ghh)= zcI`?`+?ljDB`qzlt7QSB%gg66x*!OQKHM}7e}w9%uT8@rnMu8wk=9+a(z>=xrBRTb z!>>WG**HsR%@)k8l;>m@kzg~fxd}q=A86@>I-4OhnKoy>fUd@7XP0DG&WWN=&73$?5+O$fMz9q>>Qw$iCiBQ z9ls+br@ZUz+iwfn^NLTN>kz&`R}UXQdHOVBY&g3cbiV!ptE&aYJugXhHB0A#g>*hN zAf@x50CW!8)sAaLoUWF%%O~d7UV*B9@X1-$?yg9h$7UrQe5(hW=~m1m=Jj%DKF+z_ z{S`Mh$f)YeoT|<`0#(fh-w-xmJOwrnwUEu#$L9M`}32Z1u5TUO=dpJn$CQj@id)D zqhMq3Qq#n6F@*c5z4V^R-OQe+_+WNx?Ap0=#|~VN-V_Z?mgh6y3f4d8TBrK8VHc+rWjL16JS7Hs7s*UP#LvRuc-GjquwhLAWNaa^mdpO8wqi9N7yLD=nbkb}1cT}@uNVx9TEBM0By z>A1;0I(h$wy$7r<-!$K56PCJvr{$KtLC4g;sDY3JKEZoV!V-p*bw?jaugj=CO? z$WJ(GV!w>X6aDr(=GpHrbl61f+u>zv;ca|o1K%EDip@Y3j`@C@$qyrBQ!}#O-oKqOH7In4-1bFG-2?8 zj0#pLrE$T0X`GH?j}p7hi(|KO7P}>NI#nVe85NwxE}1Dgg~72>RqS?j*VRIQ!;+gV zX%OtP^^EPL**Gdn4H5{Ne|Gie&q3WspAzm~869X>a5woCVeF1IpI}xPXUq-@wzPHp zz?u(S#_llx40j_!Snk4m7XOeE2X*wO>`8f=aWaSLn1|2t(36RoWqr3lx+Y3*DmvTH zuvk^&AE2-Niu|%>ckKdg+}oq1Zv&xk*j!Zu^bN}>yF%#uJ3?Re=8{-@)pMI#C&&>a z1%0zx$ql0$H%}|*Tck=~GAoFZhOkiy-~6iH{tHU@ssX-qF~3L&->T;3-rjkAMl6OZ z`i!_~%kBB7z&A-f{ND?s|078)CMoGZl60c3hlf9X`o|){ACsmNCzB+J-zU%s)A4G8 z_;|U1ij&96VtCQiNmZ&&-baRgHxn>GjKht|A}tsM4fHEa5d zOByH;@7%g^9c~rx+_??)1e46*OII7N21D6R8gOtq$^=qNdYKkn!Ppr*Fqf1uWa}p3xc(Hp zq^z+C53Z2|MSSeD5akM;j3v!g>I9_patS(n6p9Q6#EXp37Ud0Vn`vdG0<5K%J+%${V^);-l^(JmF)mfGCak=RdEgk+YSLLqO6O08u|2Ny*Ls`Z@h*g?7a%LanQE6fvL_~2T6a&qnU`ua~lrC4n{#r$=4 zWH0T)qI6{<)kU@9A%(W3uE;KH4v19gI@sSgOV=Sn*P~%`+LjS9mFf-UCF9`hw|~4y z_*!3`G@q~j@wj2c@l~gyk>hJ0TX^Uy9d=R?xA-S!`C2r~*UH}hz9EIURWBVZDwdZp zkhZvbQA4+D_WrPM?>uRnpcWb)_xptZJ3%WVH1w;kh`2u_OvO(pyoi4xpaqk0Qpi_H zG;@-Pl0-5Q-{CtG&V(_cT0#C^E=LZ+14SLXiw7hJtq<6-r!leQj?rgSYEo|Oe`R0m)+YL?z1bXh@Ya5*y(=W5i;ahPIiJfy?n9!fKdaZ((t9dAO&`{+;%+ zqf&d_lB}YlQ>W_3LqiEwe?PmJuGF%O3RKHksP=ZwbgTDpQ*s@rDt6AIAPJ^h87k~M)N1uH1=_j9j_}<-H zmq+^9d&cvL>c&k%|8$~Gvozf|aq}N8AKvOB?s>FWA!GdL}UtnZ>dP(n{ z+t=ZOSesaXXAzVNUyst$3s9;uLos}M9!i@CO5Igas#zH(&M3J=Q2JLErQ%xQe3arG zT$xg;RyVSih&Ma>$uT(1uIhO#Jg!$5fFlPt(}ZdHWt>IsJfOz$B7Yb6?{Vs(Sn~YOI7uuo=IhuOF?7siwCtojN)}0j zpnnSEh0-Cq!9h5r>fv{}gh){!px|lFxzXZkB_~TsyPtH&yBb(X(M183T}VN)jmqqI;P6Y_oA?fIEQ5O#CXn%Ac=!++ z)`Y0!#-$wheV7$$tjcAUKS6z!S*B}g0exwLxny<~1%DD}Rk%VOT($fwSUF>%hMIsn z01hid4HSs6f@sE=Q)YiN|IR{UZUFL{niv@`MbC}+;L0G4H88KRVmXBm&n(x1_ytPg z2}1s6jE%ar>IR92zNHb*VCnibE6i3~tuo+gS*h#jty;2T#paD$_-iBfyrp5fdL2IX z-3D9N!Q{kZ?~(NTZ(90JUvEdpjYoGJSZ5u*E7g6=7Nel-ykiDlr#uhaFA;3f(KglAUUK=W zy7|SAzWiUmxmx-!$xEAl{>3})`q2;5byu1g7^?Hu`7T1z@oFMaX`yCmf-osDK^9LX z(1}(_smWoLZ)hWsM>Qm2r_48kR_VGs_ef-JCVCuy9NPio-5&s&d`u)T@ z0AZ@qGmyEyW7ahAHQlkC%v4f+SP0c=hvhg!bIi*>_+(PHX!POxB2k^_ERz3EKV{|w z>N#$wBxi7NXhHE+^zb`c`_awFNYTVBSLrKK?3Oe*IQ0*36UXzpdJ$s{8t%UN=fwYl zsfO?5y6jZL{Q}{@g@1p{|Mn6N1y!`n$Evz-Ty`1Fm0#-{II1?bvsCRCcOFqus5eB! zc-%N8P?f6XA}G|pn#m4zR9=f|%We95lu(GfE<-YN+W1U(LaYWA#^YkWCZtMcgMH)@5PkYUa(YZ$LweJtx(u$ zVD)+%#=t<*HS0FLsURtP_6$kB1U`B)Eau5Dd`s*qPzJ?j2Y)l1mNei$M9!K`Zj->A zPnTHoktBZ|4x>@vC+=4&IQo+8B?EuD$nnXN-4YWc+ECZXglzSp!Gxxf3>5(>+tB*X z<^}Lc;0eb(Yd&Eoy^_2$$Ij=dluj?xBiLMGiggYf_`5PIH3^(8EhuxD1p}$cv!s;h zT*QV2`VWgsU7P5gy9W1$TRYGh(=wTgo0s&oy81t3>3gCIxwK@CUIXgmpMYr=jt zRbbk0SY?4e*veg27F##2cyqb#+BcW2&{=P)y~k2(yRpaWrAB63)-1DLzHW=Z?e-Y+ zjUEASuV0(Y)8Dq$)XvmC*2-y<-9Am{Ei2xz_XxGt+s^kp`eu0OuAqc8?+AAfxA342 zXF-06y~Bx!H6g)!kJv`7w?Dplr-jSXO&e`@CnX($oIPl>#K2fh-%v+WS5HsJOwUNi z%Fslew^UoxNY~U#3nzW_jg7PpE&|Mp3Sja}Ltf-i*-RQ!PE|0T%nAJWoc5)QBjZ84$o@ADn!(<7;q$H5vprmBk zYbcq-%1(}wt!;}_vV)`K%R051(K4OZ3gW8@Og^vsZ-o(eab|MHoPC~lQ%g@leq~uH zUCvj*BwH;7C#eo5nW^8D+J-ZiAAj({haY|X(FYITy*YlakHuuJGMPu!5*LPDouw|c z>sEKnU;VUt=}+cl+AJr@Wd?}P83!qs$-5r&J{}sITF`avlk1|sI#MIOvj`@Oe+ZLz zOO=^ChskCRlS5d{Sb)h6YCq$xo?j&vlP=YFa^@m@k?xBM3adwyoUCkEz)A1etWpIh zE5S+ltKO{dZiiV367KL$CQ@b`ISBWXf1M_1 zcqdHBQJ%bfQ9BvJAFrDXnZ@MEiIb8jUgXzNFCyv47f_nAFbM!D4}KCP4W@&5fi%vz z8y@%bcC$YSv(jDIZQCnntxWYWQH!?IPAs{BcP4M4slRC*F3N1(wrw-H5=oA!PXd$N zq8sTHVY+F96sT0&v>Cg+IK7VCeg+p4c=%DqnwZjCais=}0a!}_D2YAj43P62F4YWR z35!rDMGlt6#zx4Ok$Gb%V3oCv3}nR~*_ywvp0xRkH6azr*7;)+#F;NKRtTJf!gUeTGlMhaS`Ph60A`!YwD^QYib!ASsCfz9Ks5d70!$B zakzmKlsxYlumALXm4nZ-B-xx=6k^Y~yuS|3`!14zi^k{FVlUxfhJu4Bq^Q}Z!a>ce z;!8CZ6_k>M7YpUy-}^`c_;oA^=_c*Q=Hg12OjlSgRE#x=hYq<22WnZxDC*)^Nc!~( z#W;Qu9ut?|VHG1-Sar5Ur}-2{VJk2S`@HTiN_)5>%)%D2_HYt0)1VD6(ZV7$>*;dM zUe;t9Y4}HvAsQJG{&r~EGv#lM)OS`UCN{nIi=RLG@V)nd#E;&8@XpP#bA7G#6~zU) znQVD8ELfF@yMC027v>zN*#nce;EMVar6Z6S$4W=`SPhFrnf*%#OGhUcckh6R_>8i% z?_WzSD-)MTH8e1veoAgiPBDL@na|W8a?-K8Y`%2Vcpw&Cje1Vgk8~g&ABZwCvd@tU zr}~BKSFT7dYmRli%EhuO%vR}-52UB>-+#g@Zx)P{NV77cA~S3F|9;GT%ex5uSSXs$ zMJ=zG%+fkV2dNNgIRRr;!%Xk99*wTX7{W!hnTr=?WL-@`#!_}GnRrjPq=JlfAfvc& zvV$cfs~_Pf)LUBLs(NK|X|=L}l%;eQh0-*=eP?3g^5r{s8Z#0S1aT#)2?;4FG9eSs zBx@GrCZoMMOU=lM$bXBFhtuIN!sN)yB_QRW0~wH#K5p#q=j-Wm^uQi?wvh#bJ=9)i zAG22vtmI}^0*$!!jkT-SY}oSVn>bp#ej^25PQ#!!!2)lEqQ}?glD*6`<_)>986ZM zGd*bMZDO@{?WU#Mtacr8KfG!~@Zp^v!tIBbIy!0DyGHNZaP*jmnb}*beI2)32YDa1 zdeb4%YtPB#fW2?7JQC^k_VSnjr}eG}UG}XtT(x=IW;X}J{aqeDZx|RF@bvUntkBZd zFf%k-s%4;~t*wJjysn;+p1F>(zM-XwmGRcSi;%PZA0}rCA?L+K$=R(!&XTl6$XQhr zt3u8KLQYuqKOidpucohM8q&<;4=6#yo`$ zGsjLc>{L;hCd?+|sGLEMNmE;YK~Xtrx+C8v2L0Icod7)5N$N<6c9X_Xd4GNX5a@Zi z{g>Dyxc>n7{1EiKF?P0hj-JFES(TnUIC@57qu@3D_l5MNZ_WHO^du+7Si61~1wCIl zSU5Vly88y6OwMb)dV9R=T%kA$^t{8ua~e(#%!Im#gJ*Ne96Sp!lB)SY>~u9M>IF^R zWFpbv$>8U(@KgglXTZ+>*Ru1h2n8(hrNU*a{$xgkZTH(>zJ1?}o{HT^^OeVSW z!VW(v;aS}{)BChXy&;=pr)VBKYn6@;Z7r2OeT%cRue82N^{nHTYApE{mwOI|8LRd`qFBBSVjg zMpH)@W-oYGi)B{W!9}LNN(+D`sH80!ya{FYpXPjvW$NVP5~+&YTSP~ioBhG`do!si z&Xiy|c!@b-Ezy~5)c|jTNh}M}#Ilf^YZHY^s6L;Xo-S~z*u4A=C*L*dTbEj_vGCY< zXwPcvrKaoDcdgxVz?iq4w}0cI&5==tE1lMD*miK6gUNoI9lT?_jqBVGz9Dq8J(zXO zZhz3et%s4QFQeUc>@4gKZ3(s78soj!Yps>nx^-`dxY+OAe&j&GN?rGpfk$k8wg>y@ zEL(e&xBmcdb7Y3I-CG7G8k*Y6mqTirSuZuR&?om+bYY;NZmMCasiC89WUL`YPd*v!*DF;8C^?j+>k*xy@V3YJ z=qZK#tgU4UDz4xN3b$z$^?7<9xqL$0?eT)*2zs#@hL&yZ@O3GxxLzY z?o!qYmZFNq+M?ojACA1!lr9huPNrtjnN${)EyIuU40-x2HA5#tr$WAGc{u}O$^#`V zF)4qZ-!~v8<;(aOd3zmme0v{U<8gczPBheR-X40lHET-1nn_~N6USt?ZoxGvoAsNv zY{7{oVk9F+5p$At8I!{qK#tjYvgHK-L}cn)p2A>80{a1dcBx3=G(hM_uavI*4s0VC zHnUtC4p&fliZbRBVnd0hxD@3=azjLh>x18|l7NFmq*Bn0d@Cg7vgKMtYNChq0#!=J z%mBAe$S6L15iFLkm||~65iyF|rTJgYx(m$Ebn9Z2# zkU!nX#0;r9n)Nc)ERtOw;A)(-xfXYzmndFXoS~?|lRi^>`u*RYGr`_oJKhS|x8;PF z&1%0*wi`Fv8|={4GPTlnIc#?{&TW;s{f;AhH#!|XZtoP~zjf2LeRkFvo8L^%*|>4X zUSHd#`TO?yzqLNZYWvYZ+hhla&54O84wmoU8?Lq?)O)SF1JA>8$tu5XtKV8~a)f8E zw##kx;cceAPC<^A2X-wrcD3H2li=&M%_?HOvCsBn8w`${WS`uWbI^{rOKYjw29wpU zhwbsl~Zj6-T()so>_QT&1`3DmUpec!&#GtKVmAmcED; zq)BtfKt&t+I*UP*sb@NNjMSH$t*y-)?z#Br!8>>EynFw>58ekfuU|TY8-i?-4iA7I zl$rU3|C7*cAf7U+&}1*lvd|<=^C<_pqp6dtr+;{SR^_En2s6bss?6klMo;h_N<|bV zbrsyKuN@pZGcrQB*+;mkKGAZw08fob<|Z9QNAe!XMW|@k^7BTif1|L+dSmLc#%S_u zusKGs8F(ZEhXrpdut_W&G)Fs=k}_IYYLZ1(z0ztG*~wD#*h%F@5EW`Ra?}(xEk@0O zS!%Ync5~D`2WqNSwHH%hCPlWP2r|#~sWg2EGRsLDJvF_kHX{6vsGuM{Jsx$ZoZM6S zG^+Qqtf!f?und_9nGXIgP;{Wmw!{@c*!@LZuT{ zyU>-BnROC_e$W)f3f@>!tmgw!0x07y-SC{Z+Y@JCFW zYZCoxZO#1}*01It<3R^PbE2GLg<%Qdp}s@@CnFC! zp7M_M&I-ja@%niGSiufg*Tgjr$6ZR(?E`90hNtaxi1AGb+2ejJFT`PoQ$g^-8212| zUH&n`bU{qOA+JcA-G|%){6fk-NLgVw>a=sW~z&a>+Amu&2kN4X=#41#B17< z@_6b_dGKC?PD-TL+KKBf%>8h;%kq*_^X8lvm*5`vK%Tf1Q!8@`JMRMh>t{0c zi(eAa1ZmyDlWfHr{{D*p#RY6(*pxzcqtS^DI^`UI$jk7Q^bb$;*bK*u8rL59f#n2kYv7^PAs8jy~h$ zsCH#oScV7_{QvQo{+2(|`%S-2d8Goaw8E!R*DWedVXzLg<~PEB_u7q{tz1ekYO1d% z<z;<__^DvPG(M2!~bH`ZRieOCkpnwp#q1Faky zH;tHV20E0^c$qHCVCL`|JP|w{^j+`^sL+|fnE?3-DYAANVCDHd^PTpQdox}}9zswru6|6}lvQXX$E88!|?Wu@-vjs9J)MJeI99(Qg6_&>mi|>K!Qq%ZO^xk9kZqIzZhl%snVL+>jKnoj(EVHi9 zF{_#|E16?fVk66}^Qz1e-4F;G(l1;9rh++U@f(vUjGaICk@(FK>rA-{u}ZP>t|V48 zA(r?bBvwgFlXj`XE0z$8wGpf=%T2=6Ty>pdol*-^=Yx6TG8zM!v+Wu63%~yLg=eHg zqafCw#vdUT8WT4sCP?|&ihG80)eO{Dhj~5!vbrDp=qK34MpAc^_jVu zS!HD~v&P*qCRaBnKd+#m2O$y;a6Oj-#58; z_x}BR=}0tFQmR3)LKT9I3ttt6l`O$x_U;XOJ13`XFrn_!rT<0!3kXKO(Ar_)85#GK z03$xLOu5!VfVrvyERO})^_%TYY(~8}z#5bQYj15)Xv3yifRTodL3t$rRzK7~+v;XF z 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

fAuO2e>mKOp8}G$s)IIuD)r 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

Tb@cey( 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�z}df)c~~mK6x{uaaWaBSMBhbk%)fw;F5_|!3TbyBv}1M-4NoVf+}`lG?F|Z z^k6P-1Afp-w_9DfjP8okgFWc{0yPA6WEUl!0=2p(m6PDH-#2<6>i_(qhkhO(YJXln z^z-JSIi0ZZ^PLa<+;(#C!IK^;fBsMeyI>J{11Uk7)k6cFf8IWnem<{_K9NHrqsJjW zw1~&Zgc=$EM8ToQVG1sRpNa@z&3Sl%Mik-aL27?ameTn~OAS{0=h|ly(Z);^$s-%W zfGpwv;&}httyUUOA8wvk~iek?L(Iu(E3mfeZxcBSuW5t z@HbHP1!!G@Pr{W6Dh)z;W0x9{KlH>R{SK_c)a2S-hCCGYp*b0m^%ngCt(w?>bU}~U zfNnFmxit(8s-;H27A(XAuP&^6YD~$mm@(M<16T3zcfTkeo??fv{lEC0=M4J_`v$A9 ztA8>5MepHX*#30(fBTE_7Y{%Ei}dgs4y8}9_=^$G8hh^-%_Bd0_!0j+^6E*IiPBit^!$${XFo7nNKvS`kTt)XqG)f@@$Ew43jmc1(C= zPI)*l5hoKEQd72sUIIe?7ViQg~Hlk46s^*YC|Jd zsV>KcrDB;$^Vpup)CtyQ$TU&S24WJ@BTJlppyHHf?$SL@A96Xh$hQI0knh-Sk3H%i zE#c7u8$9;tqmMlnZC^arJenR$k4F5FwGWEWymFKgi7KmA9)cac3q-xCx!lwme_(xkH&7%u0$Wqjp8Z2zpV50Lq zhI2_kHz>OPqqJ+Z=`o~e85kG@lHA=Ke1}{nh;_9-oHZH2BjuHjhj8vaCVV=<>raYB1zbqak0!8Y%7o?3z+IVeCR&w=UjzLNdWXZJ+=#11WjKmLSFP!)zl{_2Uj9C8gx zoju_^;O4-1mUh}t@unxj;|1%`qmr1c7w<;^^^{m8+Px|FW)6kg#~Twborpq*l?d$T z^PZFd()+coc(Z(^iP~9`DN0Y2^n6i$Y4O>*B5z22FOaW_(&sZb;`9W1G(zu4>o#xG z!E*T3#m7tKN}whn%c*{;el^+~{SydX$~C=e5&_?eTun>V8f$GO2Evl#7lqqzmC?9t zbwUpszd$ zlt<%}3+^RUKiL;D5KIP2PMw7Lm6NoTDxPc!OONlPRh%=PCsCCQF;vQv00Y`wC?)v_ zE>P|4raL&(NVK&`f6Hpm1+gfA!ekhx)iETN@q<5Fn5-fcf{5`^pg#zwmRT#C_Ht&dQ~E-U08T>sgn)+##6ngpL+WIQ^nI~ zuo>21?L}+M{>`U0+37UF*08U!@19!Wsr=5X{o$tq&turPnD*ze8ryj4EYFjeYHVQ3 z*s-TnUEWo!dMZ8LJ`BC`6-yzO|@&rsl*gbg`ahENJ5 zEW(hUE}jurc;*i+qNsSpnjP9kXV6BO=y;|tf3OOw;*}DsNXM)ylFSx6M&&c7XL?Y# zdZJ;@NApIQPnTX#wUjBzrjC%eWJT3<%u=ORXEME}A*>nWSAz;DeTG$z^`4#Ed%L)f zN2~6d)JPt1m8TS*iOACc5e6D0H^t^(|S~&i=y$bXNVvw3;nH+;i7;lli?}R#xn!B-5C_(BNY==UsO5| z!<5(%yoNOsNwB`S?`OLSSvFEEpkY~vy0x{aNvWuRBuFAJdST-8#S1IX_g;AZg}`ox zY2CyW8DkTRj@WJ3PX1-{E1nF$@_he==byLqZ=Nq-cwRi~n7F>jrq~K5-}Lzb)t)#0 z+VdLRXE9MLDMpu)uVl>_;q-x{dM`$ zuj5PQuV0G4PA@Gf^lO8>6mb6~ZOzwZc|PFgrJrmCw{o0COg((@rM@6ND8ftW*F($g ziWP9|?5bJCUt7sef;i(#11qj<6X)9S1(Q3ksJ>BMOj*R5wpKMLAuaiRqz&q zhI3>JO0-GD4yh9HrER$ci_)E+wj>rVV@bFxwI@*fdqY$~?;!$NP`}b^^H}nexm2t| ziumJ8)|X)MrMaA;Ro@6Gp*N2XpR@RFswdOMN?Aft<2O>j5k-AO4CJL>*ZHFC{=Eaj zg}khDKvcHdz4TH;x{4THS|nH%e1ZcL8G+@?PA~UgdHLm6MlTnyj9*T#gqPzh8?2GD zZ0+UVD=)utKA&3F+V&@TjXsSHs?;+cQ&({ zLNqVyDb5P+I$Kf>ALXl-FjZbvLnf|hJUWrhQ!2#M<>@T$bz6t(;bjB4ToJ@A;^t)l zf`pgF*u1=Ccym#aA--bR@x>iGfBEVw?W?r@YVVa-UzxEBuclX~tc~p%g6$P;UhTi~ zszBTXMrI(k`D%PMzLIiAbWC`4NCM#I)gNi$%h_G8M3TiieRV+|i-%Wg&z!zGFth;C zMAezT#v|{#MUs`2juwmfB&L0JE|-(akr~ooRWl>QSPMF?T6IGkZLVLDBc|GF2R*4T zPeVi+g4aN}s;WlnnsyOe&HE@dIt^60;&8omX$%R^1@)#*O}4q|aSpdW&{vG5eYJi4 z($`*p{WY0B_II)x<6dZ-sDPjX7 z)GkAooZL!9$T$nWl@bJe9ejbM*Gd&th1RJ1!iCHla0|6V32s_y7eEHdQk$@O#reP$ zUSIHn9CZ@A70SF;S1!x5QGl#$401`DXuWryoYWizyUvT(hF(uYU|2+7o3fRBt7l_@ z$zYPPok$)!o5m%YC(Bjb?qgBRIw*|}RU*C4rpc1i>$6;w$R!56kYey{<`fGSw{-iU zkwzfCHlIOk)oGm_#Ox-+>pg(Eb1BdrYi5C!0V~@8wfU{{HqWel95gZK${TeCo?@N8F;w^sV-U*(8)M4VTEDT*a|LV6j4i$~ zAjOkZvZZ8VJ^sd=vAqEp0b7+S;(aBI--vG_c@u19dBvN{tSY+l#wMu1PBz8XO|MRs zH=&dhm>Q_wXxzCeEpNO@%N|hs2^+b_HzsfO-+b%MH)n69H`})$eyhhZvRktgb7LI| z^wyifm-yBIjE-R6s)-A~{??K(BIDbb*RtYUI|P^Ct$r)Kncf<@Gf=p;qS__fHSEG$ zI-g&3;=#tKS^i`@Tdh8pcSmJMG&6?)di7MX0FOh^U@wvl>^Hwj@1AFEu*q-Md5*Av)!1@AD|!N({6^0TQ*=u1x!?5Rcz2bf zl7b&+zbW7S&A|)jb8Jsys(SV}Q=T$adk+)W1e;m?HFi=a?D^j`@1gCz_--U1{QNM>P%T@=XNbfBf&Y|(WQo0H<3RZ73z1so~ zfK|I|zhd84jrP5{Trs}4sGWa=6^AM}-KZpBW<&!+sziF15rp?}pg}WHEm!KD#(d%; z085Jt*ExE!(n!haqL{rmln|fSz$OvUpPeG9)ww~uu$1_`?j0BKltGN_docc#am}vW7S#K zyq`W;d4K7Bf$TwU`e0^};)4nMODy0)Lx@J8@cz)V0*Ctj)~Zh}=t=~eBT?V_{l35o z%Vs99lPuX1BUbse*4dI8;NxNyQ)|up^X7$8$@Tlu618`LM5>T`q@tTb3$c5(c5{-q zy3mj(IxGOAn)e~xz{n=BYkCWIQn=3DzMnOWefIBnZF-ATWL86?L$+U6`XHHfi8iqa z<f#HduunwKBygj#^9ozVybo?+x)QMsS1_D6dZk+u;PPr7P4ZeEn8W#OewOl1w^3Y3W`vT z1ZhB-e49=_HaCPHP&Se4jcKpC7aDX)t!FtY(*rUF+7;5easkrSZcNdHV4Fp!k9r?} z^l|(secb=(_zx`zKvrj+!lrN9)S^Bj6?9=#J)Y5!beA<52;w?YLliZsz z3dYZd%KPlonviIW=TlPpqKmK<90tbSh_e2y{&YU0h_s*Wu)>xoRQN35OrLHuGUvlZ z3VZTIDIJCB>EVs!Xl*_%*h%G_>mY4GIrfo1m?{=@sELlJXS_cay%)(FH6TvUW1~Yd zEgF|af9feY&r0ziWlnp(u@i^D^w~~4=GMwLx}<1uxujD=v-#JK_Y@Nqt*D0k+0;;M zKcyNi@Ki%XM_azeq5CtCnE$|vcYMYu8AjULeGc;3Z^14O63xNxS}7X1j!E|lVf447 zK!C2v2vk`PS^DgEzb!t0`nQ4SgV@R6-oSJHw=sv8e9MEQ@;&ggwGeg z`26!PKL3Je_+o*bZNG@0_i)C~mn`Iv@Ok=T-Vi+E7k#D0&&w}Job#+N+Rs~D;fn;6 zxM1byUsRk5jBT*syt67Ze%|N6M(pYH!Wo+{W?4YO5x@AUmF>itV0pq94Oz7`M5~Do z1yPX|;SZlLdZPE3E>dh1h2;*U0zy9(5HkSIiRggP7wAwI%@>PaLu@{y=@*w8K>gy> z*E^H;f|(>VMD`9>CD+Riw2esJ3p8|w?9(*zAT?11`Dnm9eQN}A#xMSwm*4WZj7}1( zNhqi?XBhGP*ren{uuB~wkdPio`v`&wg(`v#V- zpwX+=yc2xMw!r`^9KIZg7f1TCM-3-PoLZ~^s{K&a1uDKQa=?KOr~wA6EHU!6oLlzH zVBZ#J(>2W;OpHrN?p8O2)bMHPXwlo(Ge~V^36SH z_oBQ0vZk7bp1uO~6}2&~=dfd6_4a*bo^?(E#5hL-YlTho`P^57eP4aGZ{O-yTq&mb z#aOY<$WO+os636G#N%r1q1YhM;`$+;$$Ct+Sg+}mA=Qpi(9RX~hyyY8L8>B_mzzvOi+ z)2e0`D?0ODTVpKp7#6m$(&eq&^fk$bY4t^+am25O-iSBr(=7H^q*a84LuX<;!PS0^ zVo|o;g!9Dc>B5CtaR2_PcOgor)de0H>_4!7{{biuAj~YV@5|e8thGI`zqJUrbpVig z;(@e(cmUXe17UxFpkSS{4&*dXaGC^(xRXJ=PTb!E6iLZE%83USwfMIMZ&Xl*1EnN# zB-mOlIhQ!0&FTq`INm90%?|YN#sfPXUg!y8#@ab3^l2F5)C085+%A%T7#|OHhdnL8f0FSvT zA7wY1f=KE{MPja?Mt{21z3I{H^igSNHV$O?)U9#@)ehT9hc%Ih;5XLVT$=q$#-+#p z182YKANb~*182S|4m4QA4q~fV{mnj};hS_|#(D_Ty6Fj@v3>rVHG(y}_M3QM%=*PQ zy#wEn;sotC8|;3-CfTDBA{mjl{EaBjW9Pm}2RFXG^x(JO>YEqss&9*f@!NUx9Q>AT z#EOFrR)0Ih1E|FraEvgm@!KBmcrbn2gCXbyCLQd9HqeYi`gSgtX)IkS;o!nnaa9pn z__j|L`9XYar6`yTog9`78jV)M(!o-pbg%%Jx02jAS>5q|Ygk3ZGx@eW2!2j7`AS#H zl!B-zT&<}Xc@4D%9`v_af{HBV&a_lEj0SIUa8WoxMXq}3AQRf^Ea(FG=%LjfKJj#L zMne7VzyRtDC3PO5rjzKP;+ekPZV=CQQ5vIa;=#VQ z&7nTegYnQ@jszm<(9li?TMp$RqEH-a4h}3?ao!K}rGq==6LaPc_~RjQ1F8-sDsVxE zxK{$TS8H)4EMh(K#9d_mLkGj5ZLU-t2M@Ie7i^;f@lelrZRI2>PSqZ=_B@4ZPOIKb zt3aNbmC==&GcQEkr%MYai`Rg4iR4a+jYKDPo=aKFCeMT(q`h=--jbL|pa3OJS2N0hcxWIYCNmzo#P;^^6d^T9b>WtDQ)mjDb*}

8A$mBzfbumt_(K}R}TI!R}bPA>PC{}i0U)1#JYx2R)n z+E`j$UeuzR3KCUH8(N(jjWjQFkmfQ0nbhTx&QLk}2s;D{#*We^-Do5Dw6ByXB1Os! z+g^!=8m0~857o{gpEU}CFD){$9S3n7P zJ(DR!P8=hk5UV-j#MMtqJyF}pat7KirYE8%?>R2U6Hqu^UbiJaZ zyTS|V3Q2Xmf|2nP(&mbcL?msm;M5VyYqO4cAy#rlPO3VRu+$Oa$gJ1|&c8Ba>HsoW0`5nvkI}+U)eDROXQAYm?KF4lBd?E80~`bncZY%H()u z9ozU9FX{^QpSiLOs~;SCLi<;~Dnz*}ldJrd!Btl}l)cJc>CsLQSK`7OsHpf#Nc<4! z1yxHt3q;Bc9WE9KAQkCXO%nlKNnfi4S2CbQvYHW#p+!j}dLAfpSq$YA#3%ZE>rGC2*&RdV#8bbePQ z>Fm;13WXs()YkcGH-A;WGNAjd>C2pIC9Y%3Npgt1I6d=X&aF@@az3Fqgr^T7jtJGE zM3|_O9}3-Kl+qU_sfw-&{_-kUfeY7Ra254Z2bH6SrCS3cw2Q)#SON}6TzggiFR!{v z_R>`X6Dc5-AzCr{AyMdsv^D>d7pIptl^U6%Fgw;)MCKu}kFWY?w2HsS7U-3y&Rt#M z3KWvNnyXVnJ5+M@W!GGN&F|3M0TALo!CakCY?1OcDbXOgG+?jsR|i4|2nU~X^T_~0 zhF2r)()N%hiYXbP&2xyq`V!5yVeB<26Jd;o9uSO>1PZQ0Wd>+4%j*=ZG=XbSV(F}`ye>gVCaJtgOra}GCDGYHMkigA1W^X| z*C^YfOutN2UR;6}krz-oJL!=A>MBOiQDY?~)DbIwATyD?2LBm<;O|i0L4S9VGcC1* z_^X6m_$x1jXTtQAlAf7gHV|$>8WAA{tN$z5zs_R_>zD-3pbO}4kXVvQ8+}>ySCFsi zCIn{mjeryp>7A&+Qzc;`OoQ1A6g+prP}YzZ2uMiVgqtnpVXG%1qm?W8(qC1ljArCp zL7tZx{5}O)@XNn0!9nJbGSY&GA0x^>_Dc=5Lbzoi$ZAq1rk}3;Is$>F9NC9cA_|nn+GRqj!qlnigB^_C6q+UcO zT?Q3ZgcBomI;-@>$PE7_GAlAi(u2vDItm#`V=Ki zX(L}LUmO8wy;irer~HeYE0q~FP$4hxcQ{vm)j$v7ZxMDCVP%mnjp-|H!IX2MCm?0O zvHv3f%5Ruhez5-EJOl9FemMSc27WjLKb(Od&cOd@XW)k`fFG`a z{=a?(>Q~7%O2RQQsr|$8hcocQ8TjE0{BQ<-I0HYNf&c%Wf#3d24@~&4Zk1F=2`3rP6Gss+RYR#|A&&_|u`&+z!B;FVOznecZ|0i8*k)N9X8TmK(JNs{VJ=v~-xwt18{s#f`YxD2^*{nK{>&h6vAUnwXk@;_?levP? z`e9gK>XG?KNcoj*3p4 z1DV~g&41)vTtn|)m_O&NU4#E;oPj^5&yOmvFK;g6wfx-tF+Kj)bTt2ke%;LfWd1is z9K^X8N~gYz*`3*SHN%+0K=LEZNW6al^N;2#M*ACcrTG(jcbR2-yPxD=gUyb|| z-3O5EMc1pCq5KT|nojal@vr|h{dXf)PW{(5KgCToQ{t(9N;q}Ol+si;rHFmm)G1Tb zeaaNV*p_H2Zi=63sq*NMlp}7`cT;jHSdxYWEjfynXe7Z-D3caxsVAP1qDa(K%}V1` zwA~a&D^XZPB2v<%6|vgBpiwimL8Bd}OlF%hIhDzi8GJH$#7!+WW}5mPxh0{6gxRP35Tc! zmQ2n}QYV;xQW4piEctTal!;QF`97c#0j7$$dLnkG_gu-i8v4Kvtj-Mb$ReE%!{rDP9ksUuF8DCvNj2~Yn)efvCq&OnrCRA%gqHeqyXUAv8 zjUP8I!W1_ee<|*G-Nj&<sQ6@5jaC9k38U<2W<+JhFG38ykIC&==>-x8PznKAkBe?{#h!iwrM#t#VC_9o)BQv8$ zjvQ4Q*>2RxQR%L(WO9-jiQz}(Bsp?aJhE0}gbBnXqLCrC8R>h^ zNRP!4H5cuXc0`EdM$i?w9pOeMBQ6n~)Tp*2a#}aSjBvxv2s_-3=rDZ52-!!np@t_T z{BS=aLL3qdN96%XRs!WpqJ0HU_u|u_p=&H#zV}|1aU+B&}c|Vu%yRmNJi2wRZSX8z^oin z8f=D~LJkdHIq1|tKd63SX3)SvgT5V@42lPuL2e+&0Ur)*d$fiP(#>F4`@ zk9d`A|9)(7zfAvr{Yc@0E(42^Qopcozy49bpnt!xU*Ep2pYLmtY`?z!`l(gGqfcMc z&-VQ>QR00xsb=3keO%v&bkfgIY$(b1Ni))hGV-QR(%1J1`u3?u5kxxl>6>n<`T|J$ zlmW&_IR!_3gFb!V?qhm4AdN`W$M?23aBz7<}I|+kZn@M+x|yym1hSfn@kAoTB2InR z)r0We+DSFLitSpRS{$9E*!0j%t4iH$*N{j|B@bekjT})lltz73iyE>29&PiQu=Q_!dsOuaP ztx^lmb@p{ZXH-xJ)O8MlF$JP==d5;$I-9y8lD5l9tTR1*T@%5x=vH*lxf7i_8A)_X zI#+e-+)0KaSc{=v=T3O0Q?aw_6ali>;(y&a(}{+a28m{Tr%=(pQw_Q^y*N09mpa?u zDQ}{nl(r&cI=6OW?wxW{)~R!`Q&#IGQ6dp*GB5pTD4t{-TABx)aLWWDqzO5W2%x9{ ziLd;-hII{ABP`Qg;q3>0IQek5d41PB$%(pLu>;(;r?2 zGM(%B1(DyhwqKa<_zn98X{`&o)bZ=huPv>+rYVeY-@=IICF)iV}2(K%iwrcHCD}gRuL3GjLGE*sc z3FNKHbS=`UVkWq*OUPSNNiE;CUf+`>BG5*JcOnW*mnMA+GhLd|Ir40-YewGBJ|kPt zJEgpVv&$Q7%p0h@U8ir^`j*ODZ2G1u@A|TfSF5JHOQ&zru3JW$$OnQ2z$Xsxyg@fU zEhOH(D4#N2^YXFMy(__>E1xyluJYO9y5@+nyKX-sEiq{-CYHX*^EuUlSoiMCQa*>e zrY*YBj}J#C1i=`JpxjX3SqA)bDm#oe+Bl@CafniLDXn|$1- zpStz>;m!xD=TkW+AGY#IET6sd3G4ZYHa)&WqV7o#)4dhpQltATNF$Q;414tKQS3>y zCsztwrf?O}ql_x_X{KcCN1K7=F()sCCsD9AWubvLe%SDpw86zp6S~9W|^XWyB>v;h)FV{y=SF6*UNa86;dUbaP~=f#UVZ4RmxQEU?;2bZz1eM_+FodNq&-)Pu8&Tm4_AwQ@|9ecD^RW><-*i)ftkhQ z0+@?a+lOn}J{j7H;tG{1w3nj3>;!xF?H%jDAwFORbX>DK&<;Q8d#PUARu0r_LWUEI z;i3vMq?_%l^B}^-vtAv$z9CTCS1zXIqB_I%bl;L*hX0{ll~=a5i*OBDF2IAn{V3Io zc)bpn1mKuTi6&_yxk%?)o?8bew+;RJmGm~Dz1%^hn<&>WFSiML!(jUd5(x2J|Ey%W zUvT|H)#=TJmHP)XfUX1RI-vgm?p4I(-lqR0+`ACbtv|7LlCFdXMBL7V_}tE5`vF0J zR8G?}KQScbx$kKdVEYC0^Kb-8E}D{rS;rmg@XqTE)L2J9yDlRd5{_0f+R>m zwIA%!t;lzS{2+@b5kEK>0>BUc$sme#lf#ffLk0~-yFq41qQK(dV9=0QO+)yy!9#`& z5+sA^KDcV|5ZwkxLvpF<2D>3(Rq}*ncSC9=sn8)6Ph1fs+l{#` z&T`*7l>1@1C(fxoEE;M__%un@4GV@2qY6pUR_~rYzT8;bVcZ`NCtDHj+=sd0WK{cM z!SG>`y4-SWsERxDVY0Dgpr%;dd6Se{xznds@A#A9!3Y)~va(d5%K~<|CCO5Uf@Cql z4zFf8LY5>(uxOAGEejAC)*@IykmU)(GKFQOLl#G5X1U{sOCCz85)WJXi2OH8abjZ!llIf@k{*0@+TvaCqiQU4C8tVOk{ z(Ui-2RV74~8QH@6)EL&h%$PDF>t=ab;2JZAY>lp+$!eJ_WsNE5f><+_ET+Yyn^|wO zth<$U{mqZfjTy^o9HF-5Iu_Jq)vlncbb?Nhcnk}QtOQcas-GQK!}?%l0Wl)jUY8Oj zpg}h_t5&4zhK4o5b^y{e2+OizFm{|DZ&{@DELyUJ7s6k@$JWr zr%pU%tjuG49-EM^WapNuyXisLisVympanhA~Ly=uBoIENoA#7|%X zEbSI2WMn}&VGY^iHc!awlCZ4q`iU_jAXa*@Q;{`cR(y47Tb8svlAEY2;BI2ONvu?- z+oXw(oSVdY_{518I7{vt@{@vzm{J)C$W6>?RVC?J3b$l`A`9)4X;xW^M`O83?O5!e zJW&?mCr_Rzi}-GGGKs%5uqMxdD!QmIA^tufi~cz&nS{xh2!FLex1X$k+Tbr2YS<~% zPH~f~r$|JCC4Bw{fyLh-RQNjvf36T){vweV7+L<>F;)J;(w;x=@VA||W0L+2hCh<< z$CiBhr<|!Vp8VNG{$7**2`2qh41ZF&)=hQS@`spf$zD74T01qzkxhc`+V*0nyXg4Z z%ha9vn;@}_cvkUV%Bh(eUF)W~Ys=I8wc)gDr`cZW|N>D)Y zw2XKb(@x8S7cZI?O$)A@=C1S8{B`j(bDf)(zi!$z*%|G+_S3FYk0YA`BEp&LEBTy+ z1sYs;y+c)Bp8}^{7hQ*a-SsN*b%tzSY<7E{zrKB%kt5sn&DYuMJs?SGC&BycLsBm7 zqews9Tpv$&*SqQd`UJa#xal!5iHmKnFH8@wpMHJw^z8N1r(X}MN;S5hVW!73+;lg? zPfuoKrq7r$GbZF_*y&|Wi5*OzS(M!LnRbSe{LIpfnwc{IPZ#ks90@n`(it;n&X_r4 z*34NP*$L(_X3ZpLW=WZy;b-P0KsKJ~W>l*sPzDiLIBUiXJ2Rw_n~|l}jG2C>n`J3? zGySY^<}AEmrUvZHnprbv&SEr>IG78``07#Jq9#4YO}_H+Vuui^?~Iq+%i->&Dsfjpl|DVi9*^=7t+@y2;*HbrZ#6 zMmJ`q&rMDdH4;vD%UF3FiAZT$?r(^0EZ*dA3<b zZpuj9&oMV8Dqd}e9nT4GnsZaDM#U=6$#I;+^yYXZd(#|jhb>YBhQ2v7=jNMlaW|V= z?9FCQf^L(>n=`k}xn)jK5Oe0Zo5Ne?%&|8Ib8d-m_TtXD`If@X!7VqtTMUxD`IcL6 zxjDHdyjhM0@wa-Q#aqm+@h$#le@iu)TW(>nTNRB?ZplcbL^>}CIwZF;5k$1RwT8$o zw~FAHTS^-A074=Scx5EMH6t)pio4a$HMhFC{?9e2*Z^UnG6ap%v+ws+e3wX~Wq8@s*p4=Q<$ zffGEHG|ox}`zI;-4yl)jy2LYg5^?i$ciuJsF2R|*%JUskEk65QcSZ9vD2B{Q=&rkx z`Tj1!CG$hv1}wS=*4<_1TjWAT#Fkiem!IE=c{BV8OzLjhJqMS$KXyW+83?H^O!3mId_- z&3zXThnzqx(z4Jm^!NFN`TG_wyzjpIiB+kEBd~a3wYc|lxZmBEEDQvZ+!vBgNGH@* zFT5|^$oTt$h4+<6lEm#bUNg?rK#ztt7c39-_ii^WVix(w} zgGEam5VNEV)Gf{tT)cRRU7W{Qw0Oyqgp^yHkS&xjm zw74W#x-400mbs<*WlNXJ?(kX>yVN69%LulG6G9QG^3sr?03~A4(b8bqa=XkdO_qgA zmo0b8JPE%v0}Nb5B3hQ!P6D#aa>SP}TUr$KQn$=dky(yuDJm{Ydo7Qac_hsNZ^2B| zHOu2=!SZE}s@!sE1Wf&K+4ALO;xur};^k&VBO>}d;?&NrSiXFP#w1rpqUB~~VTE7m zSA;89taK~P$_Bh(#mX|KBqWp|k&0j0vLap?u2{LEywa?&D}x7CxRsd|D_5e-ie}n4 z6|gGFcg{TIn9JEByn(N>uKFl@F|3`9QKVw@UN_F$urY5HJt8mEi*` zS0yR5AkIqrKzU_WN+?Yp$gFzcfmP)P%&HQSJm6O~t2V3L1L3MPQy}7yqDJBeN~idFrdRnWxsS zeafyiPbH}tugyy2slr()Kv)|qGGb^e)P-7^KuWF66Go++;j zQ4+W7vH~Mv6k9}>k!W4;%(|*|>({Saw|?C-c0IWD;zjG}l&sIJTThquZkD#5LYl2xZ#Ve$2~yk;uHUfUZ7}OkBP|;; z>o;uBq{np|awOT3jb?+}nBA~(;|8_M8>=^LWRrv4&`j1M(MG?)r>Ko?LpyS9yQXbh zgJ;b~_pIMo_3Xxt&&uXDdfbe-ZewNx5xX&ZHbY8r4!i|WBYNXYC3pPn=Q{%JM8#irycGI)ZZX%gNvNDfNk~Pm-#BItxy9tCN z<~R9gFWDrnMAE3QpahwbR#KDzc7U@WB@&|A8id*`cy^P24#;ztYkm)lH_&Cj*pyk)cO#J6mbX0^|4!6ZO9ZEd&2w9b-$ zj@H4J=i<#FP`5b?bjxN7Ovdxibs#E*TXX}l#cXz4yh>hz>~;&Y+mdXKHEuV1wBHhJ zW(JLdjNxPnzSUl9YXm z?h7>w8%0oGMR1Lw{5rE{Ptv9cI)=7TerJymu{5`*|%@kgLJLkPCz{NWUJd& zyLB6Ag=}|Q+eub))Y)x$NmA^#nXMt=(ssWs%Q%cq{}9Wm zsYm>FUYgFaiW%un`3|$)?r_^L*|B}Q>^t=6w)-8xcf{LcavqG^5o}je+z?#6J=j6i zZ@*MZbgR_6?KxbW?DIR=N;_(w-?8I)u{l!le0hg?KG~5Ie+Q0#KG^ZRMa4Vv1SD*C zWCZUNp4Cbw`uvXw?$olKfUut5>7MsHs<3uSq2P^%{PX#pIwVc~&L3CGc501`N`Yh8 zo%Z>R;Ns_lom2-qpU(gx<#zh#y^4E2D`gsCpmcLPFBMA@Zs)FDJ9qA~JN+&IyQn7|?%Ii!=SYfNunQzF4Ku5u1UQo< zW_NLXp}5Px;CAI-*!9A$T`yn-FYK}}lnI8oMF8Lq9qMRr2EcwzVM7k1N4vX{_J2GE^6FXM%bj9GdiOKdkyoHPP#UkItg+l_}dyCZZv z?Uwf3oxBiGu{(HScT9>F6uhvz{DP$4iAM)9lr_y3+s_B$d1bgzc{U)>+Q>h~wFX7<1O>i#Co;MM(Q zRQ#&h{|!?As(p>YUSojQ+^hN5US)gj)fW5`@mO=_)$(f@2|L_K#cNsonmthS+5z2O zJ#fIimQQWM=C$&H1fA35YwkdZ;SL0^z7`+Iz6Kb_RK&mL4~SIB*krWa9tdAgLH2-u zJw9MwZ$UfC&FkMHO_Y=m1h2oA954rx*S)|GL}>fE`0hZAB-jyRU(X(RoqUY#h__*+ z#=agNcpc=*H(K5_Z@rJ$H~m}9Xotkut#3wenS=JN%$si=eA8hjZ@Ghc?6=-L2&k+{ zf3PeCz|29xG-|XK%v%Q!zV#NnIphwuKXmZW!GnhmY2@G`doU!B91Pyl!$Ef_I%tqQ zQK>12B^7VkgY7C7;e&6L5BkIYQ0DNV!-w4A}QV|kyX)}Ms9mg5B#|a>A93%Px1)E=(Sz^!w-f9O*sbrlqvoBHN8LLYj{0{J>~9f!G`|n|U(eHzJpX7V*SxobOgqysVCn38dlDwA@Ga(^Z27TWk z?pWsiW5-a0j+u(CdjHt_?8n}Z30YE3bx6df_!5ES7-OYwp;GFOXO0~|e#{;B$NX_q z(N)KeA7ej$EGA@0In^N%o8n6ZlH<0`EmTTBIN?tgPneSyDPfCtYMYZ~e19T;@`P;I z`4cBko;Y>#MEPVURpyih;73HB3$&YvPq zAUJi}p7N*tDTjD$bGm%Wo-Ursoj!H?lqAjRgoIPjB@#*#817UCn>1JfyVD_VaQXv# z+J8WaiaTvSD4(_;5H6q2esKDO)0!|JB!Czc&?Uq^Ad~LybVdy6k(C(m5bZuRDvjv# z$hQ^0glUU zk~6`FXM(dImCt5AI{VQ_$yxJJ!&(24MHeI_8UK+#n-%jTN7!i^pNJ)6C<;FMxb%@n z%*W-Asy_bcBiTQ;xJ^hiB6j(sOFkwny8@Dr+$ZMa_>;`XpM3mrf>~1WAA5B96aR7c zlaD|7L@kLpA`#ktQY8gsC~%*ePvTEApM3i1Cry~8PyHtzT}Bf1HDxg)#D1FpR93Wsk$a&2=EcdznBKPGNUw-k$m&GsqmmUef z`0~r7V*4-5m$BOBOZ!Fe`ugjy%3ss_ z>yT)KWxl59YfB{f3eyv+Q5c7>h<8v&>Qb@N1+(VsZ@>Qf8`-~cU;A%zVtn&;`5PL1 z6XHZzhLrur5(!e2|GGwD9KI(0hw4aOD%wr#;M?z3ef#Zq=KIax`S1O??Dyxs|Nfl& z-ktN`n{(0k7VXX%B>esyagSsK5`Q0@QBZ|Kn2(9p=%(8v*G8#CgS8jXUI#;~cOA!*E3lAf}#sgaxq%9u@p zXl%l6GL5#$H)fg|Q#ae#glS2Y3A-lO7^8zGOfNNx#!WQq8*@_F*cdhYrl`59skw>0 zxyd%?L^n6JG=~_j*))}!vl3`Zu$vJ_h1Yn{(wwxI=D4M%xkWZP*p?he_3~+qkZE=; zzS$!diSd(`A1h3tsYrE8*wWhSS~9IItt|h`IfB2S}zc?EkSFG)v#+Ztr3zC zt|d>kO5AE%!q!3|YE25RHB)G9Mfrkl4GXP>3u*<0R;xkRYQUL7Lik6m0!^i&s)~hT zfxQ?Pd@(81U{!W?#1nukxEKu5xr zLjtbUBDz!r;>vl2luI^Z7$lB-IYB!WhxX-C#Xldpa-?}*4x=)*)cDv%**J=$$i+S~ zcs9=B#$|_XVjG3z;yyx;&?OrtL~RF- zR${Valr7znR_kz?5VqiBo39|f%{lAH0YgRZQar%;bdUsi9FZDzHOdSK1p;#}S7|^5 zQwy!P9Vimd6Gn4ZGWa%jwHyh1dec=@1`v=yM)BU`OP4fU#ER1)1Z3!u@t_=LqAs1# zX{GlOxj-9xLo8IN=TsU*E6ZAyl?wjk`2YL{k?+4wX3-mhla7#N{3#?Fy`lg33kXJj z1&PLALey~uWE_7EX~xwMc3f`$3aXF)6+(?)Qjv$Uql5Wh!2bzUD1QO{#+7slL3N&)5y?YM(wqMO9>icO zJJDeXbRvI2*B(TE231NwFh4Utr{e&syKx={lDiszFcc~>Ru3>;I4k`b>F*fhFQAS2 zW6nfR#_p!1BLj&4rB?T#j^|MDhf!6>S>s6<^KW@ALYMMyLHB^7ix`6%%{zZPuEBP<{+x?vQ z5TgA!XIF6cy7OwUp<6Hhz3R|;I{Y!O>7SVIf7TiQSI|Pb@<)iArT@e^{U^4osp!P^ z_y6o)?f3r`|8MyJ8gNDFrSR5<<%oVaeBdQ&?)tfOKz5@lxd5!VEGw5T#;CX;?~=GxBxiGaxvz zeEm5)h3`Z&pm41SJqnB}Qzl1zW13+l)}A~S^5tuG0r5p=r9u&xZ%{K=+Q`?hAxn|( zS5NkQ5xWYFBj3B0FIk6}@~!L$;ak~uQYJ0VS74HpZ*J$(aiU6B30JyKD)ZIxRwO~{ z^=stvRdO@2%=gDdC+XM81yY(6^TqKZlJclD^Hp+(lvVts1Z|Oe)o`y&kgV`sd5eFEeo0=T9OSF=j<{9I7Fbr~JM#sYQCgKnMTk?R zjeLt<*i_^j^d)HlSBkWdgS4>ZVr?P3DxR}`B;{)hX2r*sd zToDGAHW*!qQ=$wjS>;#Z+x<|aG$5&#rwC*hudIYA@@zqxZRQ~ac|L*hc}9Up3XVdA zQjdHzu9Zg(JXTSuQG_CeMv`5T`V% z-^v3P>Ejkch7zaGUkEpfB;;9*l8P{=n6XiX;>5~x9iy#21maYSALH}9hCcIA;(3pd zXF`NBg~vl+Oc@P9N<8{fG229f1&B==MhByWL}gSwy4@%^Q{-tAcAiM_JX50NC@8=n zjj*(kkpYGMqy^z&m(j73q_lZ9rAI02!!0nSj2qjNyLn5s%XcPI+^sz9W(L*59>twn2+H}9?Jth@+^?8JOm_<^jJh5 z04iw4j}#gbo-C5*iFmT8z>`GHm8XfEl9-f+SEbJ#jR43~LxALQqqc{WsJTp~-vZO)zOz1T1lHtR6PD&q^;(;li*Mjea zN1wnrM7U2RCeLmOe+iF?A(f}Nio$p@4BrfE(Wkq-KIK(TiBRNmuENkN;Y0z&6Johx zN_ZmAjtP-TRvtFf2glryygX^9o|2vv+qh4>K6+LL9agYKY@hl=zUTS1O+#7+*hMYsUAa3yYJd*c0@;;IbDl0b%R4D@o#REeaQ(_+Mvq*wOB;QApfxzHLNuLlL zX!=`RfCB&y00^%N4-{6UG_cH5f^L9CKqBz~d2-PAPmq)N4Fifi1<5mu{bJf?JS=q7ohwRi8R4^OS~z$?$2s?=9>0<0`KqAPprBehwc&h6c+ z#G|;ay@gT5_d17&Z`&AEfanvvDYMFXo*q7gH1afXORq?uJ2t&O@9BFrBaQmJvG3t} z3jYbuH}_0Z))Zk@5jK?`JzF&BdzMvO_*MiYyepYrkfR8RN)KU6!Scdt(j6d@5mJ<- zM|Dpyu%Yze;b}-z;4bM=+g(CDbltr>d@M#96Xii{B0QDtRCs>-A~8!l3S^gj_qfNU zsyU>)@Ur;swG~&CJj5*zbSsgIAt^K{h9|~<`|)riPq23bO5Aq~^{I3CO)5{FXXG(* zh+NXg%XxU7C(;F92`RG*Pt8}Jk*|_R<-4&}o|+eKl=R8@lqV&9_&zTXfbv+rJWnr7 zCxw)3MR-z#3MHp~sQs;uL052r^p@xJ%CaVk# zDf>!Pm(v0gDS?Vb#}#T8Ayf&3OhrjlVlt8~Yk5k)5~;70D@~Zf$O1>o#iF_{=ZGlH zMb!C{l$9dooPdYIbf#lxAz5MeXedPxp`Eb!<+?;;LY@JcMN(I-OcmmAR*)tkx9D7V zfohmcG?aESbSl|r93f|d4)ktufS+)0=-YLtOR zqet0Rp27Udq-YXTesuXoS~Ad>PSq&R1GGP8p;*Qqs8-WGfV7K*xh2{{Urr zrnD{6w=*m{5)%rSbezxm;Sp+<_Ym;>*m)>cjVoMN$^|iRX7hexmhfJSA%3{1c0SNj{yLO(&ofF!~Du zA4}&V@-^}u@;%TZzjyMR&M%L?9aMg6`JLhy5R#L+_Wb(G?|S78B7G;g$e1L*|8ZSA z#Z(Zsu9-5Sc!>~c1B(i_FgUfnlj!fdt*ffk@ixM{3~x|S!U%|WsIHIkUdTHK?~>^| z91ZpT5lSfH@x^yfc^4HNlrzLyyDIle(lyj~OnH;7ylZyt67lX!K!~mM-I$tg7rNF| zJ}n5A2}qCu5Z?afBccU|k0vF_DqQ?1fn9|U8F_;j+N=mntndE@Bpqdwz3sEd>t~33 z-gGO|<9*~Ck%sNR3`XB~q%9o;_A`9R!~X94UY* zTq~jzu9(V*#EZxU+vh|4mh^(I1my~BDRM0cOJC(0v5kc#W#DVooN%60 zE+ZI{idDJ)y<+?w; z7qF61giSO&{+;_;cm?frRAVO zU?X>`Ie4(G+^Y^5`c;MUq*ZTL2g^-rVMqwiid80*lm*4g zjq4EZkd+suR&H~-&y}Ma5^*C7-zOX=KBZEToEw@+l_7726!gA28J3lsXt+>>RWu`X zDt2fvY-kJIC=$bjloSZ9hE+*g?z#p0Bfa_7fP~~;oGGE@_C6V|JSlSTFI*}aG3>C* zgf~U#Q_@udj4pB zn6Qp9{5MP6{n;qBOszBXb~1NkP=cxiWO3oL{?hZ z(xsZxNZ3w<{$x}+rAdi&B?kiBkt5QC610dps=2bzBa1z;+Cq1mWzlJrE){uMBl^8n zBUxz52|##vv&xFntjsAM<`mBgl(48k)r*~l4@DNppa&k4s?oX>=9D(rv)JXvR7(z& z0Lu7Ymbk`1sKU~gtcDR_9Zpx*SV0>*8e$aN#+Z`Q7*oR%oh;1-V`(3Z!BSEc;9xz~ z($)!SvGA-2X)*jNW9bPC@|a|7weqhpgE8-o4dFrEAhz2~UzW>9`V;xcEYU;zXb-d1%rfOrD~ABzh2YimcJ6 ze?-WsH`z_`ll_z`fU@BVF}wVoAX3{+$ya)~$?ei+ilmKjuKxjl4VirLPaX2-mB~}} z?;2Cw)N1*IjO6$uicg~)z5cyLbOc8D>V?=u{`yfugz^OYS~AxrQ?u6!Nr@HB)=Es` z{MDwS{k5g3$+dLUSgi4CsgeEKcq+sw*ZOI#*P3Y;5YfrC8KEI*!TjvnU>XX#k7;d` zBgwSfb<<>X*O_Vdx^`-(+3S9rrX;y8BpOds;*#s8O^YwmmI#;tv?4-s0=dcc)z>K{ z3CHBRf1~6hLO>#0s?s#9Be0cByB@X@cU_`9Byq}LLMXoeN0laNkrrEE@QNVr`rLFF zNT%b2s5In-l?2-%q{(CE2(i2CgXwtw`ivyv>!B&3jYlWb{S1)^@zZm{K{8zfpb3~6 zZh9~S){+D>)=)+;2_ZjS&BFA&l9$Yw;e~5thMk#(abyPkBRM>F=tK}&pdlY2kr99+ z!~F^TA2BqVeu$!v2& zVRlXmX5;u-@$6vM?3Nq+Y>O0b$iYn_v?a6s4H+RdDH1&oO-ZC8DB(Equ!|IL^k~RQ zZoHvzV_s-YpeM0np>Mn)y3r9QEgUEimasXhBCVf_7y^iIs;zLDPz33So#So_=G9xgv`mMj+>K(bwub&GURTK=UmEg1azxp+L%wOHAUUcjc}NJOOrDCY|3Xc zr*QMBTl~%S$k#{+(Ma)@=vD(Mh>(6q#zRah+sqqb8k)NMwl5v3dY@< zPiwHm1L4$E!$2!?>8*2byKOF9A#-nqG33@;Zxfc0U@i)3khz)LNHffBI?!zz7ZQ?c zuv$Zh5X;TYr%i54=4PeW+>f9LX+$j2e4EGi=;(Gc?>ht1S9hbw`b?U8G`TU zK|L}rxjnc8mJVU;5cUs04>wU-k1D1AfX*Y<4A6?UXjic#w7nxE(6%O7WeKtKf;;aJ zCJ%FGd`EESyrhlr11gR?fhTt|n8xx#>H!OgCE_YkduLWc#B!qVq>m?+#k>PMxN|;8 zctFDWVww5Lof#~YnO`PBD;4p@4#}l3uR1NZ^O@Ux?G?b)F~3$QJ5qtlLkT>Zq3Ey` zN#OMmI|P)neWa`(cK)S819Gucct7TccLTbcg1ey(xjVu3cjfNB>u$oy-8FY%-KCCI zjK9m1cVKH%jAk8Ckr1S#%-lnld$M=mbN4-1;XQZXo!pb$4e7_-ISGkdBgwnfvG>#} zGW8r4wJA#T(n%!LUdcVb%`jr_O&}5pQcjWNo}BQDhy&Y*S}2R_fx$E4Q0-HQl$f$)ozkpw$IN57#RDG>_pRYXiikVVygLF2t{VYp!7LZKV+3oH^X%-~~Y7YHAT zT@Wl>;E3lI!d9|iVNwACTCgBq_!EiACfSSPsK_bD$bFRF2f>MIv(RD(_o1>vKysg5 zn7MC((3SvRh?OYV-j^Y}Fut#yfW(xY35fz6q9aI0N=R9C0#}KFp#+u@B*7M9l2*;7 zwosbDGE!EG5#<}Xe^G){zTd%1;umGf-oHo~NF+)hB(;UTq=27S#u6w?7Pl8JkP4H? zqQ#3+-jG_XG`MI{33`!WF-UqZPI*Wiws4WS#nk}Q`iL0RCQEY4AhIN03@r!*AdCHy z+QmXL(nd5Q7%xe;gceYWcwB>RmvjKA8wb(J5=SP#M9D;!!1S>MLJz#9c8P0qmSR%9 zG$--Yk(@}pG$zq5O^~Ba+QTo&h}W_V?hnX8%FEg>7v_;=?8-nAFZ+?WX-LDwlVvsV ziY#5OI0!?QIw@Zot7Vt^Wi8A7veI&BOOO~lyIhDt>~bhUmcj6`EFl&WYtl#wFBWS# zJRdQ<9&QEXAIo9XSOMS2ikg)xR=@>9WVv0@VLA4S17% zSGbi$B!pumTq(>TWF8Pkj||?5cx7&daC~40$49V&RJ#XOJOG9UPy-= z7YOVhD})IoYs(Mg}JCJx)R&`-jPV}l(?m-V7h+E~65LB#Q`!uOgV8vC%hx~)dL*auD zJqT$Bl6~+Y7(Jlqc+esak`Jrd@9`k*crb*)19Fasl84Ph_TlV95962c3-}2dA`ir= z?;fs|e7Zl>N~Ylv2tlCd_!iyzNbb=`9)08y7(mR!%>>Kn2I2E~r1eqr$Tvs>Vv+BV z+~beQW*>*k14$k?kGaP!^c^BjWA^dfV~-0+63OHF)WMd5R1$6AD3(TL;Ik;>jnTNS<_0 zRAW8)#A-YTvxs}LTHGgBlWu*|ug(c>^=kX1eZs6RKWPM{WsXw+WC++i8Lftl;&{J+r zPShFu3ujk`73r`9OgJ{6+N)C(SaO@8fDx`AFxhqX`Hwf3nDp|$R* zoT#TT{Mz6t!d0oys6f5O-BVd;P6TY%hUhX{@Yqk8wdJRSwa=8EPS#c{NePFw?rFa^ zMuhdG2ouUPP?gxHW8%SDB|{O`65mE*VxK+-FNuAoN+?QXE8x0{6rb_1n9vAcw8Vwk zBv!7I(;N!!yF>?A#Ouf476V#2)jsmeHM4a2D?5Z+CfWFTJH(hXjrQl9k?gyHpFP5 zDS_H!LzQxhKrP}nF7rUx(Qwd>tM(kGybpu!|?rl&jp(y>!^`fx(7nQ zAygV}a~V2~R&3EQXej%JkaV!CE#w{1mXLtkTq{8`o40J;THF!{Uxu(^_-!zGaLg)Y zhTE1CCJU%JH05Ea5MZ?sYCxH>6=)4v=r)7{!)?8!65hIH8=G)z7(_ZJ+dRY;etT9p zDYm)o!lkjzZqK3Akep8mE`-IRLbUmp1VN+&|?QUBP&xJ)pY_UDskyR=R zw<7~b#dfPq7SLs&qm5fv?j4;8o<-i8-6 z>#0s&5IP8CPieQ`a{(@eGCD#RkVfQ7e6!mMzrybFo(yCO6}7jtr%Jp%d-v=v?8!pE zuzPp3Cy$nB14U3SAWj$(_U()I`hCKTAan=O-YlWL`{KR9zP(OE!ikWPnBCi6SQ9jl z-b>aZQtbB`(4tlL`4?%YYzahP^!u_e?%Vg`i;-xyMDv!oe^K&T31THLR*Qwb56@~& zFz_+Fn3pKh`jUUS;U)8O3-T>;9zRBl_?JCi)k`nG^fLP^4mWzaTHRNOSbY0(_{z&K z#qckbHEW0%^~q4v^0IjaP6n72%zg)Nf_){s|CLwZO?V}QX2HFZ7mr=?Ma2l#lL_|2 zxB!*H{<6BzAqdI~7XyX+|KwGnNzg-TU|)=+=6?IC&@q&hf}vfCPcurl0B1vp>!4Wh zuLk=Sn~{$GHFE$ug#({MbZ`n?M#H6Wz`h27!D|h$8Nh4+qk(_Dh_(kZ!h}%3{PKW# z-5!9&;0^n_dn0)LjpX(08?V3q#v4UK5FEVWD!MIRz?Yn8`?`O_Ah|c+c;n4C-n4JH zH={Qaw0X0DIK;l;(Rs46m*2<;v{(T|Z4P)BET)6ZgAv~7?&MBLd%q# z;1FB{0)fMzq?nvA9UP(F98rD(d!!oTfs}~Az3q?qx7`tg__ssC!d@UcI$|{@d6BdV z!UAPD5I@CRr7?Ir^Y%M$zXQPm$9LYwe%rl6-8(QEApV_@uzNdE9ldQeCV7#xO6uR% zxUJyr+ZpNRj#j;M^qqH(BJQYvr$%hHci(x(9*y7eN6YU7M>XS*<`wwPI|(?CXu_r? z)KDoIq88o+_iokEci}%k+`Im0jo7*!weQA9{k!F(!MmFA@8%VF^e6-gB>d6ryGMml zA+4c^Qb~b_W8vuYupfN>UPdSl;5;~1MBMxCm_^5E|9-Vl9Y~sZ9xFw{Q=kZctVJt4 z=m4gK5~YH>03=#B@+j+fy=fMntQN{NsxNa-cV zWhm<3rybM><^}6UXp!$4(qSar{_BIA&DFIUzP-;wK!aMb)Dy>3sssx)LU`ij$>c-`yFuGgazd>jlnOP(E4w@42nbNpttT=PcPE0Aa4y(W zN~7RUWrQgq5jF+Ho@#dzq6FnifGz&>){O3&{z%>WnQTs{Mqo#*|YRND`XBB<}ADpXNf7jgD7|%&JfV7 zKMNzoS$`%uTMOjO*$+9KA(s8{tW4`{PC{pd_n~msf8>oC4#EK8KN3<0VSp%~ z4GFokj);gStDF!*6CqUsDiIcThtHJZ0h$K%NBs~E!o^bY!ATO_q+8{mGAFV-v@w_#+msf^O-;9-Fv#KPMxZ*>f5(p-|9NwLPlTh z7NvpL`3vpy(FJ$jU&zl_gDxl0KA)k8E;NZdLh0Q38YT2@pD)WaJMS)ZT|9sB{Dq6> z&*v9B$%t~5^TIedLIOfZUg@GV29u~?xLvg61jmbuyvQqSWz9Ii}-SX`?BxPk?2x>IqGj*F85!))SoH1Y*G>?M)f5E&@Bl_4jBmdhrHnfrzPL;0#OW+TWG34Du^A zvSjS~%WSVuBkJr*#ni%Vq*p!o3xB0~RdJy){FMe_`zlP0D+#Hblq5l9-MkuKxtd)o z4P3nn(cVhf?UK5aW7;AgJYlqPh;R(bHGzcN+YhJ>rgWW%aj?&6$}#O0~L~k z18$JY2L}eT0YB(Wax~FkN}OE}cBvF41~OAOi>$7}A-#qM8$;AEln+LPWog`CI^+lQ zp~%Epw$dTHQ2N0PqskC`4m5r+8qSAG!$U*qupa`^G31BaL*?P2VWLt)=P=2K*^Om; zOtPVPm=aR?p$zfErJ>=Wd^jE&_QPGq=K$Iv&_~-qAMAyA4)9|Lz(;il zio=f%j``8XSSrj$0Bekl`>|Gm(@4hMm?tgthR_+2;2NTCO!Q1DCcDYW3JsH9P&AQ1{0K%JV}-*r z`HZU@<0A#xkt1#vosYN0%9=b zqbgvCU?RTWLNQl0kcRIelt=`mBWflM-^8|g3r%U%3uFkujtnx0Y=r~K8#Rhx4lkrk zK-IuL1Qj7hmU1XyR1syV-mDQwA%I34yPy}S9cn@}b3-XBikc3wmtYcE$q8sAs$s~e zBvE6Eu#Sv0VSF@21_^KxY+96Wv5QuMC@y*ky@DH37Ena0j3VGeDC0<{WXCO{vQqMT zZK0;`t&N(R)N)gWWmT9{LCNZ!t@C%Nx890dFiK)UM`%$SGsL&ix)uZtqIt;eY5_3; zMS>pcNUKInuTHFuwJK1qh$XKQ8%I;roE5B-x`n>gXaf#OeA_1}Qf?^s01c5BI(J_kTk0Xy~}P=F(u;pmya|?Sbm0P8m?6im6Y7B+{$JU;Qrj5hi zX|q%9IL^75@+70IiNMm4sx2&zn?UlsMo;J$?ev^bk!dTa9GBmS|0$7c0nI6y4Y-_~ zs}_ee5P3KXloHT~&)Su&lxmiNusvwZLUnVzRq21ns!}Rfy@~BF$|nf51MMH;4{gv6 z6<2#|Y76fsIjL(v>zPKTK=cH-PsCk!#6Jt^#q!CJ6rnb=pvwaJD9iRj7>oYHSzxLj zWcWs!DoihmfV-MLkE3Gn#3qXvPfu?+9fKHni>)J zZVs&}-v9kcMDO$eO)R1}!KL|MVcq;2m^a%X+x#OaG<-3*gubc8jGKc{vF$&gm3fDDDl(Lzo)J@L-hG&$TvNtR>IE_gQ>}9h7`M{G)#hJ!u(q9!(MbxnfR?;2Vs%16eD1qMrW;{Gb0XmHC@lL?Zu$iSO;bb8Y&2m<7MLvCl&s@-`P< zGv71fEu_ti_gGLNWpzMA;D4fhni=1=S@B)PRC=>2YY$L>Y+k(z`7mpqdP4m{M;Vpc zXG(#E*olxrs_{ZmqG`2gVNuP!4|DUUWhf7TXb)5L_hi6(004nD!cPDYQ3pWOV}1e3 z2wnri5*4eS;z7WAr+d=9a|+)9Oj7eRXil6KdV(anfVvnRFG;qy};Uxw@l?s}mkh=JF&?k@!U8 z$P6-pq{x^Yu;fhD&DLD4%ppn+R#1dY+BjNiEo-Iag_RJd+p1VlLdq0_c$)>$wuH5> z#T}xA(TO~SqIla@Q)5l$_SQDM$hK|YN;zc(WsYwbeq*EP@GIN8t!}iUmT`*!CRv>k z_4;isN+gz>k?RUSGg*?mg}s`HP?QtzGG{jY*)sgtSV>&T1{OHZk@Q=u#xUBN$TN;b z!i6)k1;kr8&`$d#|6$pzomo+URaBqwaUdg;_Wu~D2^MQlClrw#3I@p7ptC= zg)?2T&N-{LZ%zRc2~w1cNJMU(v|I#p!YcS9bV3}-JrHhDzNsoA(x%M`McgJ)kl5cQ z?C~8`cC`5%)-2_2@fPt=d9-;zMP-D$;$`4P3671^cbDa$IBi^`z&Bz=d9q^Gjo;WI z6y1Fde@Xl-@sX_KbtxG`6U*0PHIgGu($nkXb?XN~5)C2WS{L87ZWL!#hs+dVR)nK>8Ldc3nM~sv zo8nKKn3#Vqv6g&c?^;XQwZaw=#U2r|C|cV_h5->xt#xYzDQY33Ys+i!*3F2DQ#3=E zuEBd5>5z(s3b$a9il)sy*x%V$O1lk#euidPFQB%sh3H(6H^F^d#W&HGrup~6QR zPieu1(mO>iiYVuamse8{>QzltEkq{D26seuiEMnWR|!6pAlHx-8AYTYv$XuI$Ds^0 zkoGFSaugXy1SgtWRav=;*ErtkAD4IfifpA@QGqG6a%H}vCP#L>+1q%iyOr^ZUb(K% zATk_XnXbT%os7l`-`kJKk^VWt`if?+Uy<~dR^Tb$TVB!IyW&ExTag=&2;X-?Cm(zq z^|R%I3_%rg1XX1ND}G z5u_@)Y&n#HqyP&E3gDJiP>MPr+#y2=g~Uu@3<+g1Boqn-gF(WS3S6fgwJnSnK}`u@6(NR53Z4?kL)8FZNf*_O zFC>4V!Y%FE5>et;$yapT7{x93xx>`nP|}%yAm!YT__~b zoCOOP0H_gjDD9LD;2YMGqQw(tq3a7cGQQ}3@mvLVJs=d^Ojj7c_|}fD$fAU<9v*`LDAH9b z#O-oKo(dY|46B-5OcvW-r?8tMPx-*q+5{7*6eha*(U8Tue2UGME-vfxh$+|2jH{_% zGEZo>AO!4`>#P|mN`p}WDw2UnZ#6}EKMU4q1i2cpMqHSUL*$miKPoQjfk4N95nb*x zuJ@j-0Hjma%+m5=vcmt8@Nb}pe@A*RU9y-ufZ0{_kBX9iL#5G@;qVVCv;Q(-KLsSu z=^xILWk|G4;JzvTr3%zHvb3iEqWpWDAZ7m>Nl)v4Brj-r%a%TG|9=DAkN>FA(is$& zK?^O_eLyU3q5iu^%f<#YS_ZiKo+uI1?_ z#`OkrW2&2>UhaxSeT1EaRCVLkyCMsBV58`AB(uJSx)P&aus)w#E4HZ_6 zO03aW>`};$-KZA`8D&! zBnlS776BguWz-09sl?+j- zT4piNRA}v;t*a8V%!);#^;D*xsX&s}=j-D2>oNeketi`d(zCj88wFobcmX@pRcGYlYI zrcr@SK#&ANDgiTcLKkgr6Xr#l@c~99u(zzc6T+&>$W{Xrj29@0QKt?c=tk-0E*rnF zF^ekWB%~a;W=1glCPrEa8Go>FPRDSwVA70SFa#3vbBY9ehE@C)a7YZfXn=(wlQ8-s zB$7s7Y}iF~X${;kXj3qfL{j4I7||)KFylgIlcQ2CC3GOHx0VFUAtf{F=)tupZG^5 zphg-D94H0>n}nhyd1D_jK3IW$v|~qGp(sc@OQ6%8jXyFlDVloDa3e#S76->}ai#sv zbVmg+($1Y3HcD&Aa*mPLcY;r{vCEwCP)0==9ZeYr-66cY5boF$D&D;d(_OoeeCKV9 zlWH7P1FROsLJ)WjsLqqhlmt6e((TH2F$~P`>@>r<*{*6ByJh^<#&quyUdin$%R&^U z6urNm%uv;leAhUG&6CJW3^w=Q^P_!?)eC|&E2hvUV34vt&!{+q&3(Ha(Vjlc&3gCl z4E5g*1*KJnZGwTLf*+k7=MTgAVW{7R{#_pf?|ZVod{20C5Qp^&qCG4sfU3kpgsiWk z0()HFJRS}xX74_prH~^AQ@-c*duN$U((KWjjJFVfm0h;c`%K>OaV1NRzt=>V3( zIoa!8Qqh6zUI&W_5R-UJ?f~XgjmD#K2YyVJ2kvEC6uBO^(oI7)1yB>)P6PlGiR3_8 zA(h^Dz};6Cl?m?CebkQ5-S=Zs$Utu^FdHX7x(^0Z<9^H$I8687*Crxy_m_of0baiP)S%E&yFQUDk4t+CFQlr%Z^ux9Y2OTK1RA^(Js@W z_s6?MKoSWFG?G8w0_U4a%8#VJ*GD;sr*F63~3ET9V{kC@#us<(Jcm( zNK7Z(Nq?esGCy&P(&0_sN%SzA99b}%OmA9J`N@hI(i)07pi7S8(aFXse>y!?I(_Q& zB(d+DicYsrl~12Kg%X0&DR;Vh3g*%o67i`s4WlUanC3J^PM>O>&QG;Zmrk9=0LwF! zbf?S8XVPzC0!IpAVFq<9%SoDwpMk!$m2k8;eM~|Q&;h`3F z@(HQJ7)a4WZ7TyaNz|n5VJJ-kDUm2cKzg`tz$1$$L|X_TqlYsK{loDi54VX*+#~Mc zIU*`O{K&&>*~KFjqK}Ac^p=@N%iO~18fk+)iw*hVr*-ddJ6Cz_-3rUFQmKURDEvBw^N?D5Cj zkNL+NAcw zzX}S-0Rj>xs0I~C?~qb)_pY|#fBd_Kf2{=5r~YfDcmEpXA0dIFcQt;^1!T~#y({^( z%DZ3y5#|M%$3ftM$MYWdZvUR_-I`ABWBN#4eb0OKa__0U_dP`1d*{B7q`gVz@14(9 z2E4V&-dlm_BP>w#{?_|M?1|n#B|?u-J?|eta{*2MzQEcMkq1uC2R!thjL^M*uAn2C<4<9^+n_+QTn%K&tUY9 zsej1*hW`*XA^C?&zwser(Qjm=GNs6^eF)`;J_LJ5xryZ{HzJ-r5q;P_aqEYlc;Z7J zV)Nk-Kk?xwh~yuRpFrVo=8cT{^Jwq1>;fLS$vFm`#*|?BN9#td`|k2Ill=lN5GtqpvuWgKa!H2i?LH= zWxtuAZ+@gALu~wS#vl1jFgze}vOv*EiRQmm`$(YZOiTG&6Q3 zZT?R5+ZPbRk3Rc5{&(AeXY!9mzuQ12ktQ;XWF|0V2wNYGfA3@M--|w$ApmDS_7_D6 zT;^k~-xDgPYK)kVw;{(gNoIti$kY+RV)6no(;zO0O#CqbGbKna+3)ul;pG!BTZDB9 z_?A!P09@t-_6s@abIbF;AAf?VC@(_0gi!Hr6*v2KfW&+fpi2g~rTt0ZFrS3j0^%iw z0@FmYPnIkK-Qh{CmApO*Q z8Azk8)E@pz4hP14D*gkK&Ppj+4R&3h{>-O7BR)$GhNbeEPmxfpOS~1ZE1!0s0prsC zwExUp5}zhl+fQeoq25nNpUKJhpBC8VQ~om!tNhb*ijq{>0kuqmRdN3bBFkr|iM5d& znK8}qe=5UeA=`Zxa0&pG=4a>q;b(7nH3Ey}v!4wR6;cUe)@&8?e;9uj_KJtJ;>2m8 z8h9%1^Nr6%pU;p{Bt>RE=Re;<91?$yEDIbtCV!NF!GT0c5HIM-=Rfb@n&c!(Uw~m^ zsFTm9*vvCX3LDg4_(G1o%2}B&5CxOs(7G>FjHQx8I~o0B_ebM|FC$``)c-jC6R;*F zFeNE4lMHcx;{VhW=17w`Gf)}QzQy`Xj8F6o=PBzWMB5PA{xBILK$dbq>bHi--UngMU^QVXt4+yl9!0y^xa?R?WYxeD^!w{qA?t z@A~h6tN0F33yY)u&Ue29>f$@?@0N(Q$>mD*y~$$ z`8lx}TCYaure5tn_o`m6o;x@AYId%TZUS+ydL%lRBHs7~{yf}(^EvVSLVO;4L3ANK z??52L7YLLq%0WU{0%9O^LKTn#FLypw0dW%?mPR`$89hMwgTNh#F1kw+K?5om1Q&3| zA^=o?rMuJx1VO9F~8H;xr zbAU~LxfaL-m+Fcch@g478e-G^6`cCzcdzg=VXTdO`lBmN^Zl3qe~)kgn91i~lmNW= zF_&G6U7IlY-n*-K<6m`GYFBZ}Czf52pT4^)fBozV-t~lzP-$7_#Nh@YB}%v}Rh3h* z_^SExt7LQ)XLxhtPw=geuaR`uq;z=Q=ZfLkkLUfhSwDMx?(yu$abL=TtLe4*L~;H% zSAX-w_vWP^;c{OZ7#x(tJ+AzNxcd)Mt#ri98K0CJDC3lmQ9Nj#_qPrPFMKKGwr?i* z?GL0>kRbTHyP@i^yz&S0p?Hv#lWRQA`8d+c%f5S%UrQ zdCP1NP2qU&t5-A|aZ2JaPecldFC6QK$yNz-sCOgzaEXFxVWfCI z(q%<)!gr(5SaZ~mC4`FS7W%OP!pYI{*yyOK$48^_`j{Ud9gD`>NQ#_C#>Q}YAI~Q8 z@qEIMmnZOycN0~%6XR&o@e-k%h{rKfCUzAx3gtZS&7Izj-zuHnR*smTXyVK+U-}g1 zc6q($lO;m=)62iUCLM2i+2bNVQ7^3X$+FaPr+4yypKc>91b241xKB4MtjgVdYC6G- z-J1dzFv8Xp9__fs%e+QRM%SjxGt<-Ne}3I7J(?LW{Ltl-o=@X`jc2%@nOmR1&0C({ zY;SfIcSR;SdbR3R3(ax7gvQ}s?q|HYm@AYUxm?bP!-!K)h|Z&xp2l{U)CqYaj2*`(w&?i=QVj#2Qn?!s|f&f5+AqZ{3=kdmKviD-^i zPS`Y}khIy;XvuS%61Y#BJ~QWSeC!CL!V`L)d0NZc8fj(CZn@(UL@v824y*F3ZJR?YzPm2PceU`}C8~m1>Z}fV-Qr_xahb^5 z7pKasmS^%W&9TCU!@?ONA4tVjp`uDl z%p8q!bN@fWA@cvtI->};z=+<3zc-vF{OAAnO$(RYecydjDgMg~58Oj^-i>xRZT3y+>VprC!!BW`=URI-W7c$dN{f#Iv#yC`t9hCqYvOV_*lg1;n96K3~pun z5EgGkyMgpC;dr<+I>YN1kxxf|8cjy;j~=JoBhkg^w@9~meJuLxD3AYE{J%tL^n39? zkG>LpIKCskJ^GJW{C4zg^tpIGI#7YpTcXcJ?f9QYFULOD1T^mNpSz8GDJ=f*wpKZ|eU&gfRkUX7lM=SJtFB>sn#To!#kj-qczKKf47Pc3Vs z-(=ri@$2Gwk&8wt_ao7Z@!yR;9p4%aQ0j}(OVLxbxkdcR_-{q+=mlzD5Pd!V*YUrM z#;L8F+Na{~s1^Tw{NwR2M_-60;vbKu8d~`cKiI!2-wIgkDkEqoE{Z$&R~p1dh8)2BxK3)K6y_?M_{5qOZ(L$u%$=fWWU z`E!m;lXl!0FQ&HVIBWi;TF!a(3-tKsqW<_Fpnr*$KNa^-`81IT^fKS}Y5&Aag z+#5JzGD;&$`qYF_Uor^wdXY>;s!}oEXT;Oc` zC(#i;{ngQK0G=QuzAEcz7Z%m<>wd`h21vz4=U1L^yz z^)NN;=Ir@>&Y3>G1&eSwW<@Ak@{c)_Kgv0FkrsT7v*qJ_6P}NLBYIE#i|q3yt}TOn zKmQB04f2hC14s5>(eg{twfOJzImfhZgzw;U9J`<6)71CtzeHo42R)n(|Bh?H1Mv^@ zt*CQs&hfo|9ea9?BR0($@H{5&L+wha-J}PwXFa%s27P-5DL^wT~;# zzs7a@x3KEt_yHiwBkMtGI>E_@EdVtOZEy|~P zVtg8izy_fEtAPY-&s$0X)DybpGj-n?Q))xWCfqW^+Er3%-3%yc=)y zxj4DYBOVRwJ8D5k1b=n&a+kZhyx=L*QOOD3p)OG>zbC_8UWGSXqx_zEvnQ{n^xb^+ z`r_=Jr!(B<`ziRIvsb(V;S(r)W6R^w&GN6u*M8RzF@>_@{T}?_@z%#jzDG(;q~x9L z>b6OjO5oMMYp#_Ec_`#k&%%`96&epC0nEbeS7MSc!w~5vq2giY;f@>5tjg$SCVS$$ zZ!YxAIpsz^*>wvk%>mUkP`whgtf{&43Ufg-=7}=bbLXzG$1-?^;%j8UhrU#kD)-uV zqxf3ce#2x+`!03q3)IJjA?N$n1>M2sR_2f$$m!GZ+cDV1RU6n`g)+FHwscFJ6 zZy^PQ7trit%_8W0%JF^ENQEp!Qm@$6a09C%m>to6IKwS|R&!vuHDb#Gfnymd=i^WIsB z*e1Ylfuzt=#4sWiZB2w(SQkEJzWU)h^26HY_q&kzu>NhhTHJUg0WI>{D~YE%@i*+X zn;u$jMj&SqW$S1-uEiw3+swZl2pQBiC>bcnny}b%DtPr$bkj zaJ{*8_ImT03r;^5oYXEjT%c}l*xJ^nc}8ClfI+VuGDE;S6ex#ibG8Y$acy#sj25(e}LC6x> z20Ue8P~a)EQOlAKZHQMFJ#6FGaP#$P+OA8wK51QOmU*^oQ@B2H+1}0%o9jn69$nQ2 zQSs9H67D$9u8&t)wYhjFxMgsuk;_FbTuX`zkhEy*vLiQ*uFfUMk&$(HE1pZ1mYxnv zS@ZMf#(l2*_PS@+#VbP>bXA~g47awn)wWt~Tc@}6fJ@PpWb4-Lg00XDCz?vKtt_Q{ zM(`7%1n894R4x?8Idhsy@9HN$c2}{hjLT7#%hUI{KGp5IWMmdyo|-pYp0uiWdn-SU zZ|uQ}mvHB5tZm8ZYt10OXX#p;zSgb?htIAghGKcmH3sSmSC*<>PmI`7)dlE#uQ8r$ z440_&H|?``rT}#GTX>CaOTKS+HrK?xwqv;k;l;z3Kiz!W^@{`!LAqWvH_y>Uz~WpA za0J3s?m^6#h?JHf>Q1?(5*AjB2Xcrmt3v-$Y?uD8} zjM=p5#uk=Gm&u<}7!jNvfrrd`RtAqtTrA~7Dc8z;mAop27-^er!dA^3-rQt=T)}iz z%dEw-7qm7>bwU&xWsO_Q)G1G?@@pCsk1qX7d5x}`#xryhNsxS1O&+4FmfEh&$&3q{ zw~Jeo%a`K1wAF98w8?4Bu6iJB?z-Xgh)0(sII2n}5IL~sE63PQo5V|O9}O;Aeq&jX zo9kCCZ}H*cnl)Zrv$$uvsrtp2!Jv$;_{$Zg-o>G=4Q`{~P`jI}5nLQykTOIRoWw3s zE!!p=%F1>jm@-|qA>O$5rpgz|y;mTW8T@q{gpFQl6f69E>qL{@c#-Y;{Tmnyz41%9 zP@c&EPJpZ^^t}-t#53|T?rks6Eu1l|N^m{yoi?+gwicJY7mz<&4@&RGS{Hz4F*J&U zq9TcwC(BAWPP^;dWmUOK2VBdX<-xt$EF!aa%Rs(Z9ZJUwLi5)#q<4Kswb2FeQUJK% z{T;zd@k^6sWuZ~>Wffzon8P9Tm~vdr)+PF72C{=Q9CW+|6(VOX41R_yMD zyF36PSVHU84c?WlOARZu>V^h%jsD7#rAzQ^4a+;rS zWht&I-fTUTW9#|5{911p-zkBK)~=mEnc^o)18`@(u>tYuo6o^knO>5zeHBTU#G#_- zt{2z(fGk?W)ivYlDtgh%8(QBp`sM%t!1F&@JVz)1u~&o(FjPRcm}V}{k$4GF;RVu8 zR5^Z0kFi?9Mh2aIubsgWSuV$y3u(y=#MI zNl6HOL2pSryaPuz5SPVn@okG16WUuFQVE3|fP`EG7!g^7YPiFWX~}$^fi~Ug*9;>8 z*;GM$C%)2U`A%ndlB9)Pby0zP(xrG!a%a4zw`gy8#^!n6IY*D>!aF>n6Q(pruGnKa zJ%EdNf+wkr+(Fy==~2MKaLg7Zqy&l?GsMiyqPWw@)vI;s*S`c&pn`vRgA~m*2lF46 zH~F1+;;BxiMR8ttc#M1de-cPgHFH{5;du3OHNDn9s@4|I4fQ}W_uc9NFMDR`ZwV<= z1#P={sz}P$3QKkCb}Qrj=pBaV5V<2++6KYY7&lH3 z5v;}UFu2U3g~c(z4?q0h@$%dc|9JGz=N9wyxBofCKc4J{e>`TK;Nou`F87akpI8s{ zSQ)CU(6!D9U7Om2S{(yaxm5IuhqZcktAm7etJBs`p7r{XJ5n0iLP9s8=%_C_iYeq( zq`t8D1f$h|!M~=7*?&`>e^XWaH?=IBLn9D-wG-Yc`{Y5pH7xQ?3j

ka+8i=k!emJ_(st>M=S1p}w3utIg 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 literal 0 HcmV?d00001 diff --git a/src/main.js b/src/main.js index 17adc1e..7bf8761 100644 --- a/src/main.js +++ b/src/main.js @@ -60,11 +60,11 @@ window.addEventListener('load', function() { var gui = new DAT.GUI(); var options = { - strategy: 'Ray Marching', + strategy: 'Banana', debug : false } - gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Scene']); + gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Banana']); gui.add(options, 'debug'); scene.add(new THREE.AxisHelper(20)); @@ -159,7 +159,7 @@ window.addEventListener('load', function() { renderer.render(scene, camera); } else if (options.strategy === 'Ray Marching') { rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time); - } else if (options.strategy === 'Scene') { + } else if (options.strategy === 'Banana') { rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time); } stats.end(); From 515cbb372cc807cff2a9867bcf0730f7d73321e1 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 04:46:24 -0500 Subject: [PATCH 18/26] * Build --- build/bundle.js | 6 +++--- build/bundle.js.map | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/bundle.js b/build/bundle.js index fdf34ab..ee5782d 100644 --- a/build/bundle.js +++ b/build/bundle.js @@ -119,11 +119,11 @@ var gui = new _datGui2.default.GUI(); var options = { - strategy: 'Ray Marching', + strategy: 'Banana', debug: false }; - gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Scene']); + gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Banana']); gui.add(options, 'debug'); scene.add(new THREE.AxisHelper(20)); @@ -218,7 +218,7 @@ renderer.render(scene, camera); } else if (options.strategy === 'Ray Marching') { rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time); - } else if (options.strategy === 'Scene') { + } else if (options.strategy === 'Banana') { rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time); } stats.end(); diff --git a/build/bundle.js.map b/build/bundle.js.map index f4526d3..2edc36b 100644 --- a/build/bundle.js.map +++ b/build/bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 5ee275680a02dcc32b11","webpack:///./src/main.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./src/proxy_geometry.js","webpack:///./~/three/build/three.js","webpack:///./src/rayMarching.js","webpack:///./~/three-effectcomposer/index.js","webpack:///./~/three-copyshader/index.js","webpack:///./~/three-effectcomposer/lib/renderpass.js","webpack:///./~/three-effectcomposer/lib/shaderpass.js","webpack:///./~/three-effectcomposer/lib/maskpass.js","webpack:///./~/three-effectcomposer/lib/clearmaskpass.js","webpack:///./src/glsl/pass-vert.glsl","webpack:///./src/glsl/minion.frag.glsl","webpack:///./src/glsl/rayMarch-frag.glsl","webpack:///./index.html","webpack:///./~/three-orbit-controls/index.js"],"names":["require","THREE","OrbitControls","BoxGeometry","SphereGeometry","ConeGeometry","PlaneGeometry","TorusGeometry","Math","PI","CylinderGeometry","Engine","time","deltaTime","clock","window","addEventListener","stats","setMode","domElement","style","position","left","top","document","body","appendChild","scene","Scene","camera","PerspectiveCamera","innerWidth","innerHeight","renderer","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","Clock","controls","enableDamping","enableZoom","rotateSpeed","zoomSpeed","panSpeed","fov","updateProjectionMatrix","aspect","gui","GUI","options","strategy","debug","add","AxisHelper","DirectionalLight","proxyGeometry","boxMesh","Mesh","userData","geoType","sphereMesh","coneMesh","cylinderMesh","planeMesh","torusMesh","g1","Group","rotateX","torusWrapper","set","onBeforeRender","scale","sin","y","x","z","cos","rotateZ","group","target","lookAt","Vector3","rayMarcher","tick","getDelta","cameraTime","update","begin","render","buffer","transforms","end","requestAnimationFrame","ProxyMaterial","MeshLambertMaterial","color","PROXY_BUFFER_SIZE","ProxyGeometry","bounds","_buffer","Float32Array","_transforms","mesh","children","length","computeBuffer","remove","t","i","child","worldToLocal","Matrix4","getInverse","matrixWorld","toArray","RayMarcher","EffectComposer","minionComposer","minionPass","ShaderPass","uniforms","gradientMap","type","value","u_buffer","u_count","u_debug","u_viewProjectionMatrix","u_cameraPosition","u_transforms","vertexShader","fragmentShader","renderToScreen","addPass","composer","shaderPass","txLoader","TextureLoader","load","texture","material","RenderPass","inverseProjectionMatrix","minionScene","updateMatrix","projectionMatrix","matrix","clone","multiply"],"mappings":"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EA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;A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A;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,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A,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA,sBAAqB,mGAAmG,aAAa,2CAA2C,mBAAmB,SAAS,KAAK,4BAA4B,YAAY,gBAAg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,6CAA4C;AAC5C,EAAC,4BAA4B;;AAE7B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yBAAwB,0BAA0B;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,sBAAsB;;AAE5D;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B;;;AAG3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC;;AAEvC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;A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EA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,uBAAuB;;AAE7D;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,4BAA2B,gBAAgB;;AAE3C;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4BAA2B,kBAAkB;;AAE7C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH,0BAAyB;;AAEzB;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;AACnB,mBAAkB;AAClB,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,gDAA+C;AAC/C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,0BAA0B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG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A,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,4CAA2C,OAAO;;AAElD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uDAAsD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AEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,s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A;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAqB,eAAe;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,qBAAqB;;AAEtC;;AAEA;;AAEA,kBAAiB,eAAe;;AAEhC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;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A;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,cAAc;;AAE7D,EAAC;;;;;;;;;;;;mBC9x0CuBkB,U;;AAFxB;;AAHA,KAAMrH,QAAQ,mBAAAD,CAAQ,CAAR,CAAd;AACA,KAAMuH,iBAAiB,mBAAAvH,CAAQ,CAAR,EAAgCC,KAAhC,CAAvB;;AAIe,UAASqH,UAAT,CAAoBrF,QAApB,EAA8BN,KAA9B,EAAqCE,MAArC,EAA6C;;AAExD,SAAI2F,iBAAiB,IAAID,cAAJ,CAAmBtF,QAAnB,CAArB;AACA,SAAIwF,aAAa,IAAIF,eAAeG,UAAnB,CAA8B;AAC3CC,mBAAU;AACNC,0BAAa,EAAEC,MAAM,GAAR,EAAaC,OAAO,IAApB,EADP;AAENC,uBAAU;AACNF,uBAAM,KADA;AAENC,wBAAO,IAAIvB,YAAJ;AAFD,cAFJ;AAMNyB,sBAAS;AACLH,uBAAM,GADD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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5ee275680a02dcc32b11","require('file-loader?name=[name].[ext]!../index.html');\r\n\r\nconst THREE = require('three');\r\nconst OrbitControls = require('three-orbit-controls')(THREE)\r\n\r\nimport DAT from 'dat-gui'\r\nimport Stats from 'stats-js'\r\nimport ProxyGeometry, {ProxyMaterial} from './proxy_geometry'\r\nimport RayMarcher from './rayMarching'\r\n\r\nvar BoxGeometry = new THREE.BoxGeometry(1, 1, 1);\r\nvar SphereGeometry = new THREE.SphereGeometry(1, 32, 32);\r\nvar ConeGeometry = new THREE.ConeGeometry(1, 1);\r\nvar PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 );\r\nvar TorusGeometry = new THREE.TorusGeometry( 1, .2, 16, 16, Math.PI * 2);\r\nvar CylinderGeometry = new THREE.CylinderGeometry( 1, 1, 2, 16, 17, false );\r\n\r\nvar Engine = \r\n{\r\n time : 0.0,\r\n deltaTime : 0.0,\r\n clock : null,\r\n}\r\n\r\nwindow.addEventListener('load', function() {\r\n var stats = new Stats();\r\n stats.setMode(1);\r\n stats.domElement.style.position = 'absolute';\r\n stats.domElement.style.left = '0px';\r\n stats.domElement.style.top = '0px';\r\n document.body.appendChild(stats.domElement);\r\n\r\n var scene = new THREE.Scene();\r\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\r\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n renderer.setClearColor(0x999999, 1.0);\r\n document.body.appendChild(renderer.domElement);\r\n\r\n Engine.clock = new THREE.Clock();\r\n\r\n var controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.enableZoom = true;\r\n controls.rotateSpeed = 0.3;\r\n controls.zoomSpeed = 1.0;\r\n controls.panSpeed = 2.0;\r\n\r\n camera.fov = 45;\r\n camera.updateProjectionMatrix();\r\n\r\n\r\n window.addEventListener('resize', function() {\r\n camera.aspect = window.innerWidth / window.innerHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n });\r\n\r\n var gui = new DAT.GUI();\r\n\r\n var options = {\r\n strategy: 'Ray Marching',\r\n debug : false\r\n }\r\n\r\n gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Scene']);\r\n gui.add(options, 'debug');\r\n\r\n scene.add(new THREE.AxisHelper(20));\r\n scene.add(new THREE.DirectionalLight(0xffffff, 1));\r\n\r\n var proxyGeometry = new ProxyGeometry();\r\n\r\n var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial);\r\n boxMesh.userData = { geoType : 0 }\r\n\r\n var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial);\r\n sphereMesh.userData = { geoType : 1 }\r\n\r\n var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial);\r\n coneMesh.userData = { geoType : 2}\r\n\r\n var cylinderMesh = new THREE.Mesh(CylinderGeometry, ProxyMaterial);\r\n cylinderMesh.userData = { geoType : 5 }\r\n\r\n var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial);\r\n var torusMesh = new THREE.Mesh(TorusGeometry, ProxyMaterial);\r\n \r\n // These transformations need to be hidden\r\n var g1 = new THREE.Group();\r\n planeMesh.rotateX(Math.PI * -.5);\r\n g1.add(planeMesh);\r\n g1.userData = { geoType : 3 };\r\n\r\n var torusWrapper = new THREE.Group();\r\n torusMesh.rotateX(Math.PI * -.5);\r\n torusWrapper.add(torusMesh);\r\n torusWrapper.userData = { geoType : 4 };\r\n\r\n g1.position.set(0, -1, 0);\r\n boxMesh.position.set(-3, 0, 0);\r\n coneMesh.position.set(3, 0, 0);\r\n torusWrapper.position.set(0, 0, 4);\r\n cylinderMesh.position.set(4, 1, 4);\r\n\r\n coneMesh.onBeforeRender = function() { \r\n var scale = Math.sin(Engine.time) * .35 + 1\r\n coneMesh.scale.set(scale, scale, scale);\r\n }\r\n\r\n boxMesh.onBeforeRender = function() {\r\n boxMesh.position.y = Math.sin(Engine.time) * 2 + 1;\r\n };\r\n\r\n cylinderMesh.onBeforeRender = function() {\r\n cylinderMesh.position.y = Math.sin(Engine.time + 1.5) + 1;\r\n cylinderMesh.rotateX(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n sphereMesh.onBeforeRender = function() {\r\n sphereMesh.position.x = Math.sin(Engine.time + .5);\r\n sphereMesh.position.z = Math.cos(Engine.time + .5) - .5;\r\n sphereMesh.position.y = Math.sin(Engine.time + 2.3) - .5;\r\n };\r\n\r\n torusMesh.onBeforeRender = function() {\r\n torusWrapper.rotateZ(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n proxyGeometry.add(boxMesh);\r\n proxyGeometry.add(sphereMesh);\r\n proxyGeometry.add(coneMesh);\r\n proxyGeometry.add(g1);\r\n proxyGeometry.add(torusWrapper);\r\n proxyGeometry.add(cylinderMesh);\r\n\r\n scene.add(proxyGeometry.group);\r\n\r\n controls.target.set(0,1.5,0);\r\n\r\n camera.position.set(3, 3.5, 13);\r\n camera.lookAt(new THREE.Vector3(0,0,0));\r\n \r\n var rayMarcher = new RayMarcher(renderer, scene, camera);\r\n\r\n (function tick() {\r\n var deltaTime = Engine.clock.getDelta();\r\n\r\n Engine.time += deltaTime;\r\n Engine.cameraTime += deltaTime;\r\n Engine.deltaTime = deltaTime;\r\n\r\n controls.update();\r\n stats.begin();\r\n proxyGeometry.update();\r\n\r\n if (options.strategy === 'Proxy Geometry') {\r\n renderer.render(scene, camera);\r\n } else if (options.strategy === 'Ray Marching') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time);\r\n } else if (options.strategy === 'Scene') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time);\r\n }\r\n stats.end();\r\n requestAnimationFrame(tick);\r\n })();\r\n});\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 1\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"

\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 2\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 3\n// module chunks = 0","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 4\n// module chunks = 0","const THREE = require('three');\r\n\r\nexport var ProxyMaterial = new THREE.MeshLambertMaterial({\r\n color: 0xff0000\r\n});\r\n\r\nexport const PROXY_BUFFER_SIZE = 4;\r\n\r\nexport default class ProxyGeometry {\r\n constructor(bounds) {\r\n this.group = new THREE.Group();\r\n this._buffer = new Float32Array();\r\n this._transforms = new Float32Array();\r\n }\r\n\r\n add(mesh) {\r\n this.group.add(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n remove(mesh) {\r\n this.group.remove(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n update(t = 1/60) {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n\r\n // TODO: animate objects\r\n }\r\n this.computeBuffer();\r\n }\r\n\r\n computeBuffer() {\r\n const {children} = this.group;\r\n\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n this._buffer[PROXY_BUFFER_SIZE*i] = child.position.x;\r\n this._buffer[PROXY_BUFFER_SIZE*i+1] = child.position.y;\r\n this._buffer[PROXY_BUFFER_SIZE*i+2] = child.position.z;\r\n\r\n var worldToLocal = new THREE.Matrix4();\r\n worldToLocal.getInverse(child.matrixWorld);\r\n worldToLocal.toArray(this._transforms, i * 16);\r\n\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = child.userData.geoType;\r\n // if (child.geometry instanceof THREE.BoxGeometry) {\r\n // } else if (child.geometry instanceof THREE.SphereGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 1;\r\n // } else if (child.geometry instanceof THREE.ConeGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 2;\r\n // } else if (child.geometry instanceof THREE.PlaneGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 3;\r\n // } else if (child.geometry instanceof THREE.TorusGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 4;\r\n // } else if (child.geometry instanceof THREE.CylinderGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 5;\r\n // }\r\n }\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n\r\n get transforms()\r\n {\r\n return this._transforms;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/proxy_geometry.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tEventDispatcher.prototype = {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tvar REVISION = '84';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tvar textureId = 0;\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\t\tthis.x = ( m32 - m23 ) / s;\n\t\t\tthis.y = ( m13 - m31 ) / s;\n\t\t\tthis.z = ( m21 - m12 ) / s;\n\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\t\t\tthis.w = attribute.getW( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tWebGLRenderTarget.prototype = {\n\n\t\tconstructor: WebGLRenderTarget,\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\t\t\tvar w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ];\n\n\t\t\treturn this.divideScalar( w );\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCylindrical: function( c ) {\n\n\t\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\t\tthis.y = c.y;\n\t\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeShear: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, y, z, 0,\n\t\t\t\tx, 1, z, 0,\n\t\t\t\tx, y, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tif ( far === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"float 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}\\nvec2 ltcTextureCoords( const in GeometricContext geometry, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = (LUT_SIZE - 1.0)/LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5/LUT_SIZE;\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\\n\\tint config = 0;\\n\\tif ( L[0].z > 0.0 ) config += 1;\\n\\tif ( L[1].z > 0.0 ) config += 2;\\n\\tif ( L[2].z > 0.0 ) config += 4;\\n\\tif ( L[3].z > 0.0 ) config += 8;\\n\\tn = 0;\\n\\tif ( config == 0 ) {\\n\\t} else if ( config == 1 ) {\\n\\t\\tn = 3;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 2 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 3 ) {\\n\\t\\tn = 4;\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t\\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 4 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t} else if ( config == 5 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 6 ) {\\n\\t\\tn = 4;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 7 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 8 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = L[3];\\n\\t} else if ( config == 9 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t} else if ( config == 10 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 11 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 12 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t} else if ( config == 13 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = L[2];\\n\\t\\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t} else if ( config == 14 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t} else if ( config == 15 ) {\\n\\t\\tn = 4;\\n\\t}\\n\\tif ( n == 3 )\\n\\t\\tL[3] = L[0];\\n\\tif ( n == 4 )\\n\\t\\tL[4] = L[0];\\n}\\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\\n\\tfloat cosTheta = dot( v1, v2 );\\n\\tfloat theta = acos( cosTheta );\\n\\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\\n\\treturn res;\\n}\\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\\n\\trectPoints[0] = pos - halfWidth - halfHeight;\\n\\trectPoints[1] = pos + halfWidth - halfHeight;\\n\\trectPoints[2] = pos + halfWidth + halfHeight;\\n\\trectPoints[3] = pos - halfWidth + halfHeight;\\n}\\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tvec3 T1, T2;\\n\\tT1 = normalize(V - N * dot( V, N ));\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\\n\\tvec3 clippedRect[5];\\n\\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\\n\\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\\n\\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\\n\\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\\n\\tint n;\\n\\tclipQuadToHorizon(clippedRect, n);\\n\\tif ( n == 0 )\\n\\t\\treturn vec3( 0, 0, 0 );\\n\\tclippedRect[0] = normalize( clippedRect[0] );\\n\\tclippedRect[1] = normalize( clippedRect[1] );\\n\\tclippedRect[2] = normalize( clippedRect[2] );\\n\\tclippedRect[3] = normalize( clippedRect[3] );\\n\\tclippedRect[4] = normalize( clippedRect[4] );\\n\\tfloat sum = 0.0;\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\\n\\tif (n >= 4)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\\n\\tif (n == 5)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\\n\\tsum = max( 0.0, sum );\\n\\tvec3 Lo_i = vec3( sum, sum, sum );\\n\\treturn Lo_i;\\n}\\nvec3 Rect_Area_Light_Specular_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\\n\\t\\tconst in float roughness,\\n\\t\\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tvec2 uv = ltcTextureCoords( geometry, roughness );\\n\\tvec4 brdfLtcApproxParams, t;\\n\\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\\n\\tt = texture2D( ltcMat, uv );\\n\\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\\n\\tmat3 brdfLtcApproxMat = mat3(\\n\\t\\tvec3( 1, 0, t.y ),\\n\\t\\tvec3( 0, t.z, 0 ),\\n\\t\\tvec3( t.w, 0, t.x )\\n\\t);\\n\\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\\n\\tspecularReflectance *= brdfLtcScalar;\\n\\treturn specularReflectance;\\n}\\nvec3 Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tmat3 diffuseBrdfMat = mat3(1);\\n\\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\\n\\treturn diffuseReflectance;\\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\";\n\n\tvar 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\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, 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#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\n\tvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\n\tvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar 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};\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\\n\\t}\\n#endif\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff;\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar 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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#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\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar 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 ) * flipNormal;\\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\";\n\n\tvar 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\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar 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\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\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}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\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\\t#include \\n}\\n\";\n\n\tvar 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 \\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\\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\";\n\n\tvar 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 \\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\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\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\\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\";\n\n\tvar 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 \\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\";\n\n\tvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\n\tvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\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\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\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#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\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_vertex: fog_vertex,\n\t\tfog_pars_vertex: fog_pars_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\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 ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tgradientmap: {\n\n\t\t\tgradientMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} },\n\n\t\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\t\trectAreaLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\twidth: {},\n\t\t\t\theight: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.gradientmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tscale: { value: 1 },\n\t\t\t\t\tdashSize: { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\t\t\t\tlightPos: { value: new Vector3() }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tShaderLib.standard.uniforms,\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyMatrix4( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( fog.isFog ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar materialId = 0;\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tvar x = attribute.getX( i );\n\t\t\t\tvar y = attribute.getY( i );\n\t\t\t\tvar z = attribute.getZ( i );\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\treturn this.expandByObject( object );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function expandByObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box;\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tif ( box === undefined ) box = new Box3(); // see #10547\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( light && light.isPointLight ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\t// TODO (abelnation / sam-g-steel): is this needed?\n\t\t\t\tif (shadow && shadow.isRectAreaLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material && material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tvar object3DId = 0;\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\n\t\tthis.onBeforeRender = function () {};\n\t\tthis.onAfterRender = function () {};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject3D.prototype = {\n\n\t\tconstructor: Object3D,\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.layers.mask = source.layers.mask;\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\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\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int8Array( array ), itemSize );\n\n\t}\n\n\tInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\n\tfunction Uint8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8Array( array ), itemSize );\n\n\t}\n\n\tUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\n\tfunction Uint8ClampedBufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\n\tfunction Int16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int16Array( array ), itemSize );\n\n\t}\n\n\tInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\n\tfunction Uint16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint16Array( array ), itemSize );\n\n\t}\n\n\tUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\n\tfunction Int32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int32Array( array ), itemSize );\n\n\t}\n\n\tInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\n\tfunction Uint32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint32Array( array ), itemSize );\n\n\t}\n\n\tUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\n\tfunction Float32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float32Array( array ), itemSize );\n\n\t}\n\n\tFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\n\tfunction Float64BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float64Array( array ), itemSize );\n\n\t}\n\n\tFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, {\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex = undefined;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t// http://stackoverflow.com/questions/1669190/javascript-min-max-array-values/13440842#13440842\n\n\tfunction arrayMax( array ) {\n\n\t\tvar length = array.length, max = - Infinity;\n\n\t\twhile ( length -- ) {\n\n\t\t\tif ( array[ length ] > max ) {\n\n\t\t\t\tmax = array[ length ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn max;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tvar count = 0;\n\tfunction GeometryIdCount() { return count++; }\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tGeometry.prototype = {\n\n\t\tconstructor: Geometry,\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( ( geometry && geometry.isGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( ( mesh && mesh.isMesh ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar i, il, j, jl, k, kl;\n\n\t\t\t// reset\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.colors = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [[]];\n\t\t\tthis.morphTargets = [];\n\t\t\tthis.morphNormals = [];\n\t\t\tthis.skinWeights = [];\n\t\t\tthis.skinIndices = [];\n\t\t\tthis.lineDistances = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// vertices\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// face vertex uvs\n\n\t\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargets = source.morphTargets;\n\n\t\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = {};\n\t\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t\t// vertices\n\n\t\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// normals\n\n\t\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t\t// morph normals\n\n\t\t\tvar morphNormals = source.morphNormals;\n\n\t\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphNormal = {};\n\n\t\t\t\t// vertex normals\n\n\t\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// face normals\n\n\t\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t\t}\n\n\t\t\t// skin weights\n\n\t\t\tvar skinWeights = source.skinWeights;\n\n\t\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// skin indices\n\n\t\t\tvar skinIndices = source.skinIndices;\n\n\t\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// line distances\n\n\t\t\tvar lineDistances = source.lineDistances;\n\n\t\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// update flags\n\n\t\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tBufferGeometry.prototype = {\n\n\t\tconstructor: BufferGeometry,\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tif ( Array.isArray( index ) ) {\n\n\t\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tthis.index = index;\n\n\t\t\t}\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh ) {\n\n\t\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar position = this.attributes.position;\n\n\t\t\t\tif ( position ) {\n\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( ( geometry && geometry.isBufferGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// index\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tvar morphAttributes = source.morphAttributes;\n\n\t\t\tfor ( name in morphAttributes ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// draw range\n\n\t\t\tthis.drawRange.start = source.drawRange.start;\n\t\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uv ) {\n\n\t\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar intersection;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = ( material && material.isMultiMaterial );\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar uvs;\n\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar numberOfVertices = 0;\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth = width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar ix, iy;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar ix, iy;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else if ( index.array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\t\t\t\tsize = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t \n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\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 );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshToonMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( map.isTexture ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tvar type = gl.FLOAT;\n\t\t\tvar array = data.array;\n\n\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\ttype = gl.FLOAT;\n\n\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\ttype = gl.SHORT;\n\n\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\ttype = gl.INT;\n\n\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\ttype = gl.BYTE;\n\n\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t\t}\n\n\t\t\tattributeProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\t\tattributeProperties.type = type;\n\t\t\tattributeProperties.version = data.version;\n\n\t\t\tdata.onUploadCallback();\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\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.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getAttributeProperties( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data );\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute );\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetAttributeProperties: getAttributeProperties,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\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 );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar version = parseFloat( /^WebGL\\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );\n\t\tvar lineWidthAvailable = parseFloat( version ) >= 1.0;\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\t\t\tdepthBuffer.setClear( 1 );\n\t\t\tstencilBuffer.setClear( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t\t// internal state cache\n\n\t\t\t_currentProgram = null,\n\t\t\t_currentRenderTarget = null,\n\t\t\t_currentFramebuffer = null,\n\t\t\t_currentMaterialId = - 1,\n\t\t\t_currentGeometryProgram = '',\n\t\t\t_currentCamera = null,\n\n\t\t\t_currentScissor = new Vector4(),\n\t\t\t_currentScissorTest = null,\n\n\t\t\t_currentViewport = new Vector4(),\n\n\t\t\t//\n\n\t\t\t_usedTextureUnits = 0,\n\n\t\t\t//\n\n\t\t\t_clearColor = new Color( 0x000000 ),\n\t\t\t_clearAlpha = 0,\n\n\t\t\t_width = _canvas.width,\n\t\t\t_height = _canvas.height,\n\n\t\t\t_pixelRatio = 1,\n\n\t\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissorTest = false,\n\n\t\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t\t// frustum\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t// clipping\n\n\t\t\t_clipping = new WebGLClipping(),\n\t\t\t_clippingEnabled = false,\n\t\t\t_localClippingEnabled = false,\n\n\t\t\t_sphere = new Sphere(),\n\n\t\t\t// camera matrices cache\n\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_vector3 = new Vector3(),\n\t\t\t_matrix4 = new Matrix4(),\n\t\t\t_matrix42 = new Matrix4(),\n\n\t\t\t// light arrays cache\n\n\t\t\t_lights = {\n\n\t\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\trectArea: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\t\tshadows: []\n\n\t\t\t},\n\n\t\t\t// info\n\n\t\t\t_infoRender = {\n\n\t\t\t\tcalls: 0,\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0,\n\t\t\t\tpoints: 0\n\n\t\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundPlaneCamera, backgroundPlaneMesh;\n\t\tvar backgroundBoxCamera, backgroundBoxMesh;\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\t\tmaterial.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\t\tvar attributeProperties = objects.getAttributeProperties( geometryAttribute );\n\n\t\t\t\t\t\tvar buffer = attributeProperties.__webglBuffer;\n\t\t\t\t\t\tvar type = attributeProperties.type;\n\t\t\t\t\t\tvar bytesPerElement = attributeProperties.bytesPerElement;\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tstate.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tif ( backgroundBoxCamera === undefined ) {\n\n\t\t\t\t\tbackgroundBoxCamera = new PerspectiveCamera();\n\n\t\t\t\t\tbackgroundBoxMesh = new Mesh(\n\t\t\t\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\t\tfog: false\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );\n\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tif ( backgroundPlaneCamera === undefined ) {\n\n\t\t\t\t\tbackgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\t\tbackgroundPlaneMesh = new Mesh(\n\t\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t\t! material.isRawShaderMaterial ||\n\t\t\t\tmaterial.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.rectAreaLights.value = _lights.rectArea;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isMeshNormalMaterial ||\n\t\t\t\t\tmaterial.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// RectAreaLight Texture\n\t\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\t\tif ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE;\n\t\t\t\tif ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE;\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t\tif ( material.gradientMap ) {\n\n\t\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\t\tr = 0, g = 0, b = 0,\n\t\t\t\tcolor,\n\t\t\t\tintensity,\n\t\t\t\tdistance,\n\t\t\t\tshadowMap,\n\n\t\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\trectAreaLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\t// (a) intensity controls irradiance of entire light\n\t\t\t\t\tuniforms.color\n\t\t\t\t\t\t.copy( color )\n\t\t\t\t\t\t.multiplyScalar( intensity / ( light.width * light.height ) );\n\n\t\t\t\t\t// (b) intensity controls the radiance per light area\n\t\t\t\t\t// uniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\t\t_matrix42.identity();\n\t\t\t\t\t_matrix4.copy( light.matrixWorld );\n\t\t\t\t\t_matrix4.premultiply( viewMatrix );\n\t\t\t\t\t_matrix42.extractRotation( _matrix4 );\n\n\t\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\t\tuniforms.halfWidth.applyMatrix4( _matrix42 );\n\t\t\t\t\tuniforms.halfHeight.applyMatrix4( _matrix42 );\n\n\t\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\t\t_lights.rectArea[ rectAreaLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.rectArea.length = rectAreaLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t// TODO (sam-g-steel) why aren't we using join\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar i, j, l, o, ol;\n\t\tvar edge = [ 0, 0 ], edges = {}, e;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\t\tvar vertex;\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tvar position, indices, groups;\n\t\t\tvar group, start, count;\n\t\t\tvar index1, index2;\n\n\t\t\tvertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\t\t\t\tindices = geometry.index;\n\t\t\t\tgroups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.count );\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\t\tstart = group.start;\n\t\t\t\t\tcount = group.count;\n\n\t\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices.getX( i + j );\n\t\t\t\t\t\t\tedge[ 1 ] = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( key in edges ) {\n\n\t\t\t\t\te = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\n\t\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tvar v = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tvar u = j / slices;\n\n\t\t\t\tvar p = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\tvar a = i * sliceCount + j;\n\t\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tvar azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\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\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\t r, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, j;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\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.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // curve to extrude shape along\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( ( font && font.isFont ) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar ix, iy;\n\n\t\tvar index = 0;\n\t\tvar grid = [];\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = iy / heightSegments;\n\n\t\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tvar u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// some helper variables\n\n\t\tvar segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t */\n\n\tfunction ShapeGeometry( shapes, curveSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tcurveSegments = curveSegments || 12;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar groupStart = 0;\n\t\tvar groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tvar i, l, shapeHole;\n\n\t\t\tvar indexOffset = vertices.length / 3;\n\t\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\t\tvar shapeVertices = points.shape;\n\t\t\tvar shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t\t// also check if holes are in the opposite direction\n\n\t\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\t\tvar edge = [ 0, 0 ], edges = {};\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t\t// prepare source geometry\n\n\t\tvar geometry2;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar sourceVertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tkey = edge.toString();\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\tvar e = edges[ key ];\n\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar index = 0;\n\t\tvar indexOffset = 0;\n\t\tvar indexArray = [];\n\t\tvar halfHeight = height / 2;\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\n\t\t\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, s;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tShapeBufferGeometry: ShapeBufferGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tBoxGeometry: BoxGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = Array.isArray( materials ) ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author takahirox / http://github.com/takahirox\n\t *\n\t * parameters = {\n\t * gradientMap: new THREE.Texture( )\n\t * }\n\t */\n\n\tfunction MeshToonMaterial( parameters ) {\n\n\t\tMeshPhongMaterial.call( this );\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.gradientMap = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\n\tMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\n\tMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\n\tMeshToonMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshToonMaterial: MeshToonMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FileLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FileLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { type: mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMimeType: function ( value ) {\n\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tfunction DataTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( DataTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\t\timage.addEventListener( 'load', function () {\n\n\t\t\t\tCache.add( url, this );\n\n\t\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\t/*\n\t\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t\t}, false );\n\t\t\t*/\n\n\t\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\timage.src = url;\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function ( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function () {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function () {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function ( timeOffset ) {\n\n\t\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function ( timeScale ) {\n\n\t\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function ( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== - 1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function () {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif ( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function () {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0; m !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar BlendingMode = {\n\t\t\t\tNoBlending: NoBlending,\n\t\t\t\tNormalBlending: NormalBlending,\n\t\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\t\tCustomBlending: CustomBlending\n\t\t\t};\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\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.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = null;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tscope.parse( json, onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tvar TextureMapping = {\n\t\t\t\tUVMapping: UVMapping,\n\t\t\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\t\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\t\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\t\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\t\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\t\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\t\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t\t\t};\n\n\t\t\tvar TextureWrapping = {\n\t\t\t\tRepeatWrapping: RepeatWrapping,\n\t\t\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\t\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t\t\t};\n\n\t\t\tvar TextureFilter = {\n\t\t\t\tNearestFilter: NearestFilter,\n\t\t\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\t\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\t\t\tLinearFilter: LinearFilter,\n\t\t\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\t\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t\t\t};\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.' );\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Bezier Curves formulas obtained from\n\t * http://en.wikipedia.org/wiki/Bézier_curve\n\t */\n\n\tfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\tvar t2 = t * t;\n\t\tvar t3 = t * t2;\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t}\n\n\t//\n\n\tfunction QuadraticBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * p;\n\n\t}\n\n\tfunction QuadraticBezierP1( t, p ) {\n\n\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t}\n\n\tfunction QuadraticBezierP2( t, p ) {\n\n\t\treturn t * t * p;\n\n\t}\n\n\tfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\t\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\t\tQuadraticBezierP2( t, p2 );\n\n\t}\n\n\t//\n\n\tfunction CubicBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * k * p;\n\n\t}\n\n\tfunction CubicBezierP1( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn 3 * k * k * t * p;\n\n\t}\n\n\tfunction CubicBezierP2( t, p ) {\n\n\t\treturn 3 * ( 1 - t ) * t * t * p;\n\n\t}\n\n\tfunction CubicBezierP3( t, p ) {\n\n\t\treturn t * t * t * p;\n\n\t}\n\n\tfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\t\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\t\tCubicBezierP3( t, p3 );\n\n\t}\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.CatmullRomCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\n\n\t\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function ( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\treturn new Vector2(\n\t\t\tCatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),\n\t\t\tCatmullRom( weight, point0.y, point1.y, point2.y, point3.y )\n\t\t);\n\n\t};\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector2(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector2(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\t **/\n\n\tfunction ShapePath() {\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tShapePath.prototype = {\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push( this.currentPath );\n\t\t\tthis.currentPath.moveTo( x, y );\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tthis.currentPath.lineTo( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts ) {\n\n\t\t\tthis.currentPath.splineThru( pts );\n\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\t\toffsetX = 0;\n\t\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [];\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tvar AudioContext = {\n\n\t\tgetContext: function () {\n\n\t\t\tif ( context === undefined ) {\n\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t\t}\n\n\t\t\treturn context;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = AudioContext.getContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction RectAreaLight ( color, intensity, width, height ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.position.set( 0, 1, 0 );\n\t\tthis.updateMatrix();\n\n\t\tthis.width = ( width !== undefined ) ? width : 10;\n\t\tthis.height = ( height !== undefined ) ? height : 10;\n\n\t\t// TODO (abelnation): distance/decay\n\n\t\t// TODO (abelnation): update method for RectAreaLight to update transform to lookat target\n\n\t\t// TODO (abelnation): shadows\n\t\t// this.shadow = new THREE.RectAreaLightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\t// TODO (abelnation): RectAreaLight update when light shape is changed\n\tRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: RectAreaLight,\n\n\t\tisRectAreaLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\t// this.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.loop = false;\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.buffer;\n\t\t\tsource.loop = this.loop;\n\t\t\tsource.onended = this.onEnded.bind( this );\n\t\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\t\tsource.start( 0, this.startTime );\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.loop = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.loop = this.loop;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tbufferType = Array;\n\t\t\t\tmixFunction = this._select;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:[\\w-]+[\\/:])*)([\\w-]+)?(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?\\.([\\w-]+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ],\n\t\t\t\t\tknownObject = undefined;\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis._loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tAnimationMixer.prototype = {\n\n\t\tconstructor: AnimationMixer,\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function () {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function ( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function () {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function ( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function ( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function ( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function ( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function ( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function () {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function ( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function ( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function () {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tUniform.prototype.clone = function () {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n\t *\n\t */\n\n\tfunction Cylindrical( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tCylindrical.prototype = {\n\n\t\tconstructor: Cylindrical,\n\n\t\tset: function ( radius, theta, y ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.theta = theta;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.theta = other.theta;\n\t\t\tthis.y = other.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\t\tthis.y = vec3.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = 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} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar color1 = new Color( 0, 0, 1 );\n\t\tvar color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( object && object.isBone ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar boneMatrix = new Matrix4();\n\t\tvar matrixWorldInv = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\t\tfor ( var i = 0, j = 0; i < this.bones.length; i ++ ) {\n\n\t\t\t\tvar bone = this.bones[ i ];\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tj += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t * @author Mugen87 / http://github.com/Mugen87\n\t */\n\n\tfunction RectAreaLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar materialFront = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false\n\t\t} );\n\n\t\tvar materialBack = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false,\n\t\t\twireframe: true\n\t\t} );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 6 * 3 ), 3 ) );\n\n\t\t// shows the \"front\" of the light, e.g. where light comes from\n\n\t\tthis.add( new Mesh( geometry, materialFront ) );\n\n\t\t// shows the \"back\" of the light, which does not emit light\n\n\t\tthis.add( new Mesh( geometry, materialBack ) );\n\n\t\tthis.update();\n\n\t}\n\n\tRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\n\tRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\n\tRectAreaLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\t\tthis.children[ 1 ].geometry.dispose();\n\t\tthis.children[ 1 ].material.dispose();\n\n\t};\n\n\tRectAreaLightHelper.prototype.update = function () {\n\n\t\tvar vector1 = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh1 = this.children[ 0 ];\n\t\t\tvar mesh2 = this.children[ 1 ];\n\n\t\t\tif ( this.light.target ) {\n\n\t\t\t\tvector1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\t\tvar lookVec = vector2.clone().sub( vector1 );\n\t\t\t\tmesh1.lookAt( lookVec );\n\t\t\t\tmesh2.lookAt( lookVec );\n\n\t\t\t}\n\n\t\t\t// update materials\n\n\t\t\tmesh1.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tmesh2.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// calculate new dimensions of the helper\n\n\t\t\tvar hx = this.light.width * 0.5;\n\t\t\tvar hy = this.light.height * 0.5;\n\n\t\t\t// because the buffer attribute is shared over both geometries, we only have to update once\n\n\t\t\tvar position = mesh1.geometry.getAttribute( 'position' );\n\t\t\tvar array = position.array;\n\n\t\t\t// first face\n\n\t\t\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\t\t\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\t\t\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\n\t\t\t// second face\n\n\t\t\tarray[ 9 ] = - hx; array[ 10 ] = hy; array[ 11 ] = 0;\n\t\t\tarray[ 12 ] = - hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\t\t\tarray[ 15 ] = hx; array[ 16 ] = - hy; array[ 17 ] = 0;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction HemisphereLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } );\n\n\t\tvar position = geometry.getAttribute( 'position' );\n\t\tvar colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar color1 = new Color();\n\t\tvar color2 = new Color();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh = this.children[ 0 ];\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tcolor2.copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tsize = size || 10;\n\t\tdivisions = divisions || 10;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = size / divisions;\n\t\tvar halfSize = size / 2;\n\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author Hectate / http://www.github.com/Hectate\n\t */\n\n\tfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\t\tradius = radius || 10;\n\t\tradials = radials || 16;\n\t\tcircles = circles || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar x, z;\n\t\tvar v, i, j, r, color;\n\n\t\t// create the radials\n\n\t\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * radius;\n\t\t\tz = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tr = radius - ( radius / circles * i );\n\n\t\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tPolarGridHelper.prototype = Object.create( LineSegments.prototype );\n\tPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new BufferGeometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar colorFrustum = new Color( 0xffaa00 );\n\t\tvar colorCone = new Color( 0xff0000 );\n\t\tvar colorUp = new Color( 0x00aaff );\n\t\tvar colorTarget = new Color( 0xffffff );\n\t\tvar colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", colorFrustum );\n\t\taddLine( \"n2\", \"n4\", colorFrustum );\n\t\taddLine( \"n4\", \"n3\", colorFrustum );\n\t\taddLine( \"n3\", \"n1\", colorFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", colorFrustum );\n\t\taddLine( \"f2\", \"f4\", colorFrustum );\n\t\taddLine( \"f4\", \"f3\", colorFrustum );\n\t\taddLine( \"f3\", \"f1\", colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", colorFrustum );\n\t\taddLine( \"n2\", \"f2\", colorFrustum );\n\t\taddLine( \"n3\", \"f3\", colorFrustum );\n\t\taddLine( \"n4\", \"f4\", colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", colorCone );\n\t\taddLine( \"p\", \"n2\", colorCone );\n\t\taddLine( \"p\", \"n3\", colorCone );\n\t\taddLine( \"p\", \"n4\", colorCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", colorUp );\n\t\taddLine( \"u2\", \"u3\", colorUp );\n\t\taddLine( \"u3\", \"u1\", colorUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", colorTarget );\n\t\taddLine( \"p\", \"c\", colorCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", colorCross );\n\t\taddLine( \"cn3\", \"cn4\", colorCross );\n\n\t\taddLine( \"cf1\", \"cf2\", colorCross );\n\t\taddLine( \"cf3\", \"cf4\", colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\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 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( object && object.isBox3 ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry;\n\tvar coneGeometry;\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( lineGeometry === undefined ) {\n\n\t\t\tlineGeometry = new BufferGeometry();\n\t\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t];\n\n\t\tvar colors = [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\n\t/*\n\tBased on an optimized c++ solution in\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t - http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tfunction CubicPoly() {\n\n\t\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tfunction init( x0, x1, t0, t1 ) {\n\n\t\t\tc0 = x0;\n\t\t\tc1 = t0;\n\t\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t\t},\n\n\t\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\t\tt1 *= dt1;\n\t\t\t\tt2 *= dt1;\n\n\t\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t\t},\n\n\t\t\tcalc: function ( t ) {\n\n\t\t\t\tvar t2 = t * t;\n\t\t\t\tvar t3 = t2 * t;\n\t\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar tmp = new Vector3();\n\tvar px = new CubicPoly();\n\tvar py = new CubicPoly();\n\tvar pz = new CubicPoly();\n\n\tfunction CatmullRomCurve3( p /* array of Vector3 */ ) {\n\n\t\tthis.points = p || [];\n\t\tthis.closed = false;\n\n\t}\n\n\tCatmullRomCurve3.prototype = Object.create( Curve.prototype );\n\tCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\n\tCatmullRomCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar l = points.length;\n\n\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\tvar point = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tp1 = points[ intPoint % l ];\n\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t}\n\n\t\treturn new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );\n\n\t};\n\n\tfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve3.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\n\tCubicBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector3(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\n\tQuadraticBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector3(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t};\n\n\tfunction LineCurve3( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve3.prototype = Object.create( Curve.prototype );\n\tLineCurve3.prototype.constructor = LineCurve3;\n\n\tLineCurve3.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar vector = new Vector3();\n\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\tvector.multiplyScalar( t );\n\t\tvector.add( this.v1 );\n\n\t\treturn vector;\n\n\t};\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction MeshFaceMaterial( materials ) {\n\n\t\tconsole.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' );\n\t\treturn new MultiMaterial( materials );\n\n\t}\n\n\tfunction PointCloud( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction Particle( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\treturn new Sprite( material );\n\n\t}\n\n\tfunction ParticleSystem( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction PointCloudMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleBasicMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleSystemMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction Vertex( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\n\t}\n\n\t//\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\treturn new Int8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\treturn new Uint8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\treturn new Int16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\treturn new Uint16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\treturn new Int32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\treturn new Uint32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\treturn new Float64BufferAttribute( array, itemSize );\n\n\t}\n\n\t//\n\n\tCurve.create = function ( construct, getPoint ) {\n\n\t\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\t\tconstruct.prototype = Object.create( Curve.prototype );\n\t\tconstruct.prototype.constructor = construct;\n\t\tconstruct.prototype.getPoint = getPoint;\n\n\t\treturn construct;\n\n\t};\n\n\t//\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction SplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction Spline( points ) {\n\n\t\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\tObject.assign( Spline.prototype, {\n\n\t\tinitFromArray: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t\t},\n\t\tgetControlPointsArray: function ( optionalTarget ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t\t},\n\t\treparametrizeByArcLength: function ( samplingCoef ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\t//\n\tfunction BoundingBoxHelper( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\treturn new BoxHelper( object, color );\n\n\t}\n\n\tfunction EdgesHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\tfunction WireframeHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\t//\n\n\tfunction XHRLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\treturn new FileLoader( manager );\n\n\t}\n\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\treturn new DataTextureLoader( manager );\n\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tLine3.prototype.center = function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t};\n\n\t_Math.random16 = function () {\n\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t};\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\textractPosition: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\n\t\t},\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\trotateAxis: function ( v ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\ttranslate: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t\t},\n\t\trotateX: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t\t},\n\t\trotateY: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t\t},\n\t\trotateZ: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t\t},\n\t\trotateByAxis: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t\t},\n\t\tmakeFrustum: function( left, right, bottom, top, near, far ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t\t}\n\n\t} );\n\n\tPlane.prototype.isIntersectionLine = function ( line ) {\n\n\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\treturn this.intersectsLine( line );\n\n\t};\n\n\tQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t};\n\n\tObject.assign( Ray.prototype, {\n\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\n\t\textrude: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tsetEulerFromRotationMatrix: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t\t},\n\t\tapplyProjection: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\t\treturn this.applyMatrix4( m );\n\n\t\t},\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tGeometry.prototype.computeTangents = function () {\n\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t};\n\n\tObject.assign( Object3D.prototype, {\n\n\t\tgetChildByName: function ( name ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\n\t\t},\n\t\trenderDepth: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\n\t\teulerOrder: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\n\t\tobjects: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\n\t\tlength: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\t\treturn this.array.length;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\n\t\taddIndex: function ( index ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\t\tif ( indexOffset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\n\t\t},\n\t\tclearDrawCalls: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\n\t\t},\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t\t},\n\t\tcomputeOffsets: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\n\t\tdynamic: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\n\t\twrapAround: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\t\tmetal: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\n\t\tderivatives: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\n\t\tsupportsFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\t\treturn this.capabilities.vertexTextures;\n\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\n\t\t},\n\t\tinitMaterial: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t\t},\n\t\taddPrePlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t\t},\n\t\taddPostPlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t\t},\n\t\tupdateShadowMap: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.enabled;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.cullFace;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\n\t\tcullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\t\twrapS: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tAudio.prototype.load = function ( file ) {\n\n\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\tvar scope = this;\n\t\tvar audioLoader = new AudioLoader();\n\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\tscope.setBuffer( buffer );\n\n\t\t} );\n\t\treturn this;\n\n\t};\n\n\tAudioAnalyser.prototype.getData = function () {\n\n\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\treturn this.getFrequencyData();\n\n\t};\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector() {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function () {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer() {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.Texture = Texture;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.FileLoader = FileLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.RectAreaLight = RectAreaLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.AudioContext = AudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Cylindrical = Cylindrical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.RectAreaLightHelper = RectAreaLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.PolarGridHelper = PolarGridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.Path = Path;\n\texports.ShapePath = ShapePath;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ShapeBufferGeometry = ShapeBufferGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshToonMaterial = MeshToonMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.Float64BufferAttribute = Float64BufferAttribute;\n\texports.Float32BufferAttribute = Float32BufferAttribute;\n\texports.Uint32BufferAttribute = Uint32BufferAttribute;\n\texports.Int32BufferAttribute = Int32BufferAttribute;\n\texports.Uint16BufferAttribute = Uint16BufferAttribute;\n\texports.Int16BufferAttribute = Int16BufferAttribute;\n\texports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\n\texports.Uint8BufferAttribute = Uint8BufferAttribute;\n\texports.Int8BufferAttribute = Int8BufferAttribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MeshFaceMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Particle;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.Spline = Spline;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.XHRLoader = XHRLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 6\n// module chunks = 0","const THREE = require('three');\r\nconst EffectComposer = require('three-effectcomposer')(THREE)\r\n\r\nimport {PROXY_BUFFER_SIZE} from './proxy_geometry'\r\n\r\nexport default function RayMarcher(renderer, scene, camera) {\r\n\r\n var minionComposer = new EffectComposer(renderer);\r\n var minionPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n gradientMap: { type: \"t\", value: null},\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/minion.frag.glsl')\r\n });\r\n minionPass.renderToScreen = true;\r\n minionComposer.addPass(minionPass);\r\n\r\n var composer = new EffectComposer(renderer);\r\n var shaderPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/rayMarch-frag.glsl')\r\n });\r\n shaderPass.renderToScreen = true;\r\n\r\n var txLoader = new THREE.TextureLoader();\r\n txLoader.load('./images/gradients.png', function(texture) {\r\n minionPass.material.uniforms.gradientMap.value = texture;\r\n });\r\n\r\n // Adding this composer we force updating the scene transformations\r\n composer.addPass(new EffectComposer.RenderPass(scene, camera));\r\n composer.addPass(shaderPass);\r\n\r\n var inverseProjectionMatrix = new THREE.Matrix4();\r\n\r\n return {\r\n render: function(buffer, transforms, camera, options, minionScene, time) \r\n {\r\n\r\n camera.updateMatrix();\r\n camera.updateProjectionMatrix();\r\n inverseProjectionMatrix.getInverse(camera.projectionMatrix);\r\n\r\n if(minionScene)\r\n {\r\n minionPass.material.uniforms.u_buffer.value = buffer;\r\n minionPass.material.uniforms.u_transforms.value = transforms;\r\n minionPass.material.uniforms.u_count.value = 0;\r\n minionPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n minionPass.material.uniforms.time.value = time;\r\n\r\n minionPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n minionPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n minionComposer.render();\r\n }\r\n else\r\n {\r\n shaderPass.material.uniforms.u_buffer.value = buffer;\r\n shaderPass.material.uniforms.u_transforms.value = transforms;\r\n shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE;\r\n shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n shaderPass.material.uniforms.time.value = time;\r\n\r\n shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n composer.render();\r\n } \r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/rayMarching.js","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n var CopyShader = EffectComposer.CopyShader = require('three-copyshader')\n , RenderPass = EffectComposer.RenderPass = require('./lib/renderpass')(THREE)\n , ShaderPass = EffectComposer.ShaderPass = require('./lib/shaderpass')(THREE, EffectComposer)\n , MaskPass = EffectComposer.MaskPass = require('./lib/maskpass')(THREE)\n , ClearMaskPass = EffectComposer.ClearMaskPass = require('./lib/clearmaskpass')(THREE)\n\n function EffectComposer( renderer, renderTarget ) {\n this.renderer = renderer;\n\n if ( renderTarget === undefined ) {\n var width = window.innerWidth || 1;\n var height = window.innerHeight || 1;\n var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\n renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n this.passes = [];\n\n this.copyPass = new ShaderPass( CopyShader );\n };\n\n EffectComposer.prototype = {\n swapBuffers: function() {\n\n var tmp = this.readBuffer;\n this.readBuffer = this.writeBuffer;\n this.writeBuffer = tmp;\n\n },\n\n addPass: function ( pass ) {\n\n this.passes.push( pass );\n\n },\n\n insertPass: function ( pass, index ) {\n\n this.passes.splice( index, 0, pass );\n\n },\n\n render: function ( delta ) {\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n var maskActive = false;\n\n var pass, i, il = this.passes.length;\n\n for ( i = 0; i < il; i ++ ) {\n\n pass = this.passes[ i ];\n\n if ( !pass.enabled ) continue;\n\n pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n if ( pass.needsSwap ) {\n\n if ( maskActive ) {\n\n var context = this.renderer.context;\n\n context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n }\n\n this.swapBuffers();\n\n }\n\n if ( pass instanceof MaskPass ) {\n\n maskActive = true;\n\n } else if ( pass instanceof ClearMaskPass ) {\n\n maskActive = false;\n\n }\n\n }\n\n },\n\n reset: function ( renderTarget ) {\n\n if ( renderTarget === undefined ) {\n\n renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = window.innerWidth;\n renderTarget.height = window.innerHeight;\n\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n },\n\n setSize: function ( width, height ) {\n\n var renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = width;\n renderTarget.height = height;\n\n this.reset( renderTarget );\n\n }\n\n };\n\n // shared ortho camera\n\n EffectComposer.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n EffectComposer.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\n EffectComposer.scene = new THREE.Scene();\n EffectComposer.scene.add( EffectComposer.quad );\n\n return EffectComposer\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/index.js\n// module id = 8\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nmodule.exports = {\n uniforms: {\n \"tDiffuse\": { type: \"t\", value: null },\n \"opacity\": { type: \"f\", value: 1.0 }\n },\n vertexShader: [\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vUv = uv;\",\n \"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n \"}\"\n ].join(\"\\n\"),\n fragmentShader: [\n \"uniform float opacity;\",\n\n \"uniform sampler2D tDiffuse;\",\n\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vec4 texel = texture2D( tDiffuse, vUv );\",\n \"gl_FragColor = opacity * texel;\",\n\n \"}\"\n ].join(\"\\n\")\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-copyshader/index.js\n// module id = 9\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function RenderPass( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n if (!(this instanceof RenderPass)) return new RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha);\n\n this.scene = scene;\n this.camera = camera;\n\n this.overrideMaterial = overrideMaterial;\n\n this.clearColor = clearColor;\n this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n this.oldClearColor = new THREE.Color();\n this.oldClearAlpha = 1;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n };\n\n RenderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n this.scene.overrideMaterial = this.overrideMaterial;\n\n if ( this.clearColor ) {\n\n this.oldClearColor.copy( renderer.getClearColor() );\n this.oldClearAlpha = renderer.getClearAlpha();\n\n renderer.setClearColor( this.clearColor, this.clearAlpha );\n\n }\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n if ( this.clearColor ) {\n\n renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n }\n\n this.scene.overrideMaterial = null;\n\n }\n\n };\n\n return RenderPass;\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/renderpass.js\n// module id = 10\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE, EffectComposer) {\n function ShaderPass( shader, textureID ) {\n if (!(this instanceof ShaderPass)) return new ShaderPass(shader, textureID);\n\n this.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n this.material = new THREE.ShaderMaterial( {\n\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader\n\n } );\n\n this.renderToScreen = false;\n\n this.enabled = true;\n this.needsSwap = true;\n this.clear = false;\n\n };\n\n ShaderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n if ( this.uniforms[ this.textureID ] ) {\n\n this.uniforms[ this.textureID ].value = readBuffer;\n\n }\n\n EffectComposer.quad.material = this.material;\n\n if ( this.renderToScreen ) {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera );\n\n } else {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera, writeBuffer, this.clear );\n\n }\n\n }\n\n };\n\n return ShaderPass;\n\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/shaderpass.js\n// module id = 11\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function MaskPass( scene, camera ) {\n if (!(this instanceof MaskPass)) return new MaskPass(scene, camera);\n\n this.scene = scene;\n this.camera = camera;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n this.inverse = false;\n };\n\n MaskPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n var context = renderer.context;\n\n // don't update color or depth\n\n context.colorMask( false, false, false, false );\n context.depthMask( false );\n\n // set up stencil\n\n var writeValue, clearValue;\n\n if ( this.inverse ) {\n\n writeValue = 0;\n clearValue = 1;\n\n } else {\n\n writeValue = 1;\n clearValue = 0;\n\n }\n\n context.enable( context.STENCIL_TEST );\n context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n context.clearStencil( clearValue );\n\n // draw into the stencil buffer\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n renderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n // re-enable update of color and depth\n\n context.colorMask( true, true, true, true );\n context.depthMask( true );\n\n // only render where stencil is set to 1\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n context.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n }\n\n };\n\n return MaskPass\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/maskpass.js\n// module id = 12\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function ClearMaskPass() {\n if (!(this instanceof ClearMaskPass)) return new ClearMaskPass(scene, camera);\n this.enabled = true;\n };\n\n ClearMaskPass.prototype = {\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n var context = renderer.context;\n context.disable( context.STENCIL_TEST );\n }\n };\n\n return ClearMaskPass\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/clearmaskpass.js\n// module id = 13\n// module chunks = 0","module.exports = \"#define FAR_CLIP 1000.0\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayDir;\\r\\nvarying vec3 f_rayPos;\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nvoid main() {\\r\\n\\tvec2 tmp = vec2(uv.x, uv.y);\\r\\n tmp = (tmp * 2.0) - vec2(1.0);\\r\\n f_ndcP = vec4(tmp, 1.0, 1.0) * FAR_CLIP;\\r\\n f_uv = uv;\\r\\n\\r\\n f_rayDir = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - u_cameraPosition);\\r\\n f_rayPos = u_cameraPosition;\\r\\n\\r\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/pass-vert.glsl\n// module id = 14\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 32\\r\\n#define SECONDARY_ITERATIONS 2\\r\\n#define EPSILON 0.01\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .0075\\r\\n\\r\\n#define AO_ITERATIONS 4\\r\\n#define AO_DELTA .133\\r\\n#define AO_DECAY .8\\r\\n#define AO_INTENSITY .3\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 18\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .01\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nuniform sampler2D gradientMap;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: https://github.com/stackgl/glsl-smooth-min\\r\\nfloat smin(float a, float b, float k) \\r\\n{\\r\\n float res = exp(-k * a) + exp(-k * b);\\r\\n return -log(res) / k;\\r\\n}\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p, float r )\\r\\n{\\r\\n\\treturn length(p) - r;\\r\\n}\\r\\n\\r\\nfloat udBox(vec3 p, vec3 b)\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p, vec2 h)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - h;\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat pow8(float x)\\r\\n{\\r\\n\\tx *= x; // xˆ2\\r\\n\\tx *= x; // xˆ4\\r\\n\\treturn x * x;\\r\\n}\\r\\n\\r\\nfloat length8(vec2 v)\\r\\n{\\r\\n\\treturn pow(pow8(v.x) + pow8(v.y), .125);\\r\\n}\\r\\n// float wheelDistance(Point3 X, Point3 C, float r, float R) {\\r\\n// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R;\\r\\n// }\\r\\n\\r\\nfloat sdTorus82( vec3 p, vec2 t )\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-t.x,p.y);\\r\\n return length8(q)-t.y;\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat sdHexPrism( vec3 p, vec2 h )\\r\\n{\\r\\n vec3 q = abs(p);\\r\\n return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\\r\\n{\\r\\n vec3 pa = p - a, ba = b - a;\\r\\n float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\\r\\n return length( pa - ba*h ) - r;\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat sdEllipsoid( in vec3 p, in vec3 r )\\r\\n{\\r\\n return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\\r\\n}\\r\\n\\r\\nfloat opUnion( float d1, float d2 )\\r\\n{\\r\\n return min(d1, d2);\\r\\n}\\r\\n\\r\\nvec3 opCheapBend( vec3 p, float magnitude)\\r\\n{\\r\\n float c = cos(magnitude * p.y);\\r\\n float s = sin(magnitude * p.y);\\r\\n mat2 m = mat2(c, -s, s, c);\\r\\n vec3 q = vec3( m * p.xy, p.z);\\r\\n return q;\\r\\n}\\r\\n\\r\\nfloat repeatDimension(float x, float m, float extent)\\r\\n{\\r\\n\\treturn mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent));\\r\\n}\\r\\n\\r\\nfloat backgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5));\\r\\n\\tbase = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0));\\r\\n\\tbase = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5)));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat farBackgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat singleTrackSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(20.0, .3, .3));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\r\\n\\tvec3 detailP = point + vec3(0.0, 0.0, -0.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, udBox(detailP, vec3(.075, .3, .1)));\\r\\n\\r\\n\\tdetailP = point + vec3(0.5, .35, -.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\tdetailP = point + vec3(0.75, .35, .3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat clawSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(.65));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1)));\\r\\n\\r\\n\\tpoint += vec3(0.0, 4.45, 0.0);\\r\\n\\tbase = min(base, udBox(point, vec3(.3, .3, .3)));\\r\\n\\r\\n\\tbase = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0));\\r\\n\\tbase = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat tracksSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0));\\t\\r\\n\\r\\n\\t// Neverending claws\\r\\n\\tpoint.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0);\\r\\n\\tbase = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0)));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat railingSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2)));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5)));\\r\\n\\r\\n\\r\\n\\t// Railing bump map ;)\\r\\n\\tvec3 bumpPoint = point + vec3(0.0, 1.15, 0.0);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tbumpPoint = point + vec3(0.25, 1.15, 0.25);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tvec3 columnPoint = point + vec3(3.0, 1.25, -2.5);\\r\\n\\tcolumnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0));\\r\\n\\tcolumnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0));\\r\\n\\r\\n\\tfloat column = udBox(columnPoint, vec3(.35, 50.0, .35));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\r\\n\\tbase = min(base, column);\\r\\n\\r\\n\\tvec3 rep = vec3(1.0, 100.0, 10.0);\\r\\n\\r\\n\\tvec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy;\\r\\n\\tscrewPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5;\\r\\n\\tfloat screws1 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\tscrewPoint.y += 4.25;\\r\\n\\tfloat screws2 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\r\\n\\treturn min(min(base, screws1), screws2);\\r\\n}\\r\\n\\r\\nfloat minionBaseSDF(vec3 point)\\r\\n{\\r\\n\\tvec3 blendOffset = vec3(0.0, 1.5, 0.0);\\r\\n\\tvec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset;\\r\\n\\tvec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset;\\r\\n\\r\\n\\tfloat base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15);\\r\\n\\r\\n\\tfloat hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135);\\r\\n\\tfloat hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135);\\r\\n\\r\\n\\tfloat foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2);\\r\\n\\tfloat foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2);\\r\\n\\r\\n\\tfloat dist = smin(base, hand1, 5.0);\\r\\n\\tdist = smin(dist, hand2, 5.0);\\r\\n\\tdist = smin(dist, foot1, 5.0);\\r\\n\\tdist = smin(dist, foot2, 5.0);\\r\\n\\r\\n\\t// Left Hand\\r\\n\\tbendedPointSym.y -= .15;\\r\\n\\tfloat handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers (note: cylinders would make it better.. but no time!)\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase1);\\r\\n\\r\\n\\t// Right Hand\\r\\n\\tbendedPoint.y -= .15;\\r\\n\\tfloat handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase2);\\r\\n\\r\\n\\tvec3 glassPoint = point - vec3(0.0, 3.0, 1.15);\\t\\r\\n\\tfloat glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1));\\r\\n\\r\\n\\tfloat belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125));\\r\\n\\tbelt = max(belt, -sdSphere(glassPoint, .5));\\r\\n\\tglassBase = min(glassBase, belt);\\r\\n\\tdist = min(dist, glassBase);\\r\\n\\r\\n\\tdist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55));\\r\\n\\r\\n\\tfloat mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0));\\r\\n\\r\\n\\tdist = max(dist, -mouth);\\r\\n\\r\\n\\treturn dist;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\n// TODO: add material types\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial)\\r\\n{\\t\\r\\n\\thitMaterial = 0.0;\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n\\tfloat farBackground = farBackgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, farBackground);\\r\\n\\thitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001));\\r\\n\\r\\n\\tfloat minion = minionBaseSDF(point);\\r\\n\\tminDistance = min(minDistance, minion);\\r\\n\\thitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001));\\r\\n\\r\\n\\tfloat railing = railingSDF(point);\\r\\n\\tminDistance = min(minDistance, railing);\\r\\n\\thitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001));\\r\\n\\r\\n\\tfloat background = backgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, background);\\r\\n\\thitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001));\\r\\n\\t\\r\\n\\tfloat tracks = tracksSDF(point);\\r\\n\\tminDistance = min(minDistance, tracks);\\r\\n\\thitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001));\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\tminDistance = min(minDistance, minionBaseSDF(point));\\r\\n\\tminDistance = min(minDistance, railingSDF(point));\\r\\n\\tminDistance = min(minDistance, backgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, farBackgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, tracksSDF(point));\\r\\n\\treturn minDistance;\\t\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t, float material)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(1.0, 5.0, 7.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5;\\r\\n\\r\\n\\tfloat falloff = 40.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\tfloat facingRatio = dot(-ray.direction, normal);\\r\\n\\r\\n\\tvec4 g = texture2D(gradientMap, vec2((material * .2) + .1, facingRatio));\\r\\n\\r\\n\\tvec3 color = mix(g.rgb, vec3(diffuse), .15);\\r\\n\\r\\n\\treturn color * (shadow * ao * falloff);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n float hitMaterial = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d, hitMaterial);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t, hitMaterial);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/minion.frag.glsl\n// module id = 15\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n\\r\\n#define MAX_GEOMETRY_COUNT 50\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 64\\r\\n#define SECONDARY_ITERATIONS 3\\r\\n#define EPSILON 0.005\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .005\\r\\n\\r\\n#define AO_ITERATIONS 5\\r\\n#define AO_DELTA .1\\r\\n#define AO_DECAY .8\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 24\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .005\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform mat4 u_transforms[MAX_GEOMETRY_COUNT];\\r\\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\\r\\nuniform int u_count;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p )\\r\\n{\\r\\n\\treturn length(p) - 1.0;\\r\\n}\\r\\n\\r\\nfloat udBox( vec3 p)\\r\\n{\\r\\n\\treturn length(max(abs(p) - vec3(.5), 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0);\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform)\\r\\n{\\r\\n\\tvec3 rep = vec3(18.0, 100.0, 18.0);\\r\\n\\tpoint = mod(point + rep * .5, rep) - rep * .5;\\r\\n\\tvec3 localPoint = (transform * vec4(point, 1.0)).xyz;\\r\\n\\r\\n if(geo.w == 0.0)\\r\\n \\treturn udBox(localPoint);\\r\\n\\telse if(geo.w == 1.0)\\r\\n\\t\\treturn sdSphere(localPoint);\\r\\n\\telse if(geo.w == 2.0)\\r\\n\\t\\treturn sdCappedCone(localPoint * .5);\\r\\n\\telse if(geo.w == 3.0)\\r\\n\\t\\treturn sdPlane(localPoint);\\r\\n\\telse if(geo.w == 4.0)\\r\\n\\t\\treturn sdTorus(localPoint);\\r\\n\\telse if(geo.w == 5.0)\\r\\n\\t\\treturn sdCappedCylinder(localPoint);\\r\\n\\r\\n\\treturn FAR_CLIP;\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\r\\n \\tfor (int i = 0; i < MAX_GEOMETRY_COUNT; i++) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n\\r\\n return minDistance;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\\r\\n{\\t\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n \\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * .15, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(0.0, 4.0, 3.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0);\\r\\n\\tfloat shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\treturn vec3(diffuse * falloff * shadow * ao);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/rayMarch-frag.glsl\n// module id = 16\n// module chunks = 0","module.exports = __webpack_public_path__ + \"index.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/file-loader?name=[name].[ext]!./index.html\n// module id = 17\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\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\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 18\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 584894f0ebabf4cd3bee","webpack:///./src/main.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./src/proxy_geometry.js","webpack:///./~/three/build/three.js","webpack:///./src/rayMarching.js","webpack:///./~/three-effectcomposer/index.js","webpack:///./~/three-copyshader/index.js","webpack:///./~/three-effectcomposer/lib/renderpass.js","webpack:///./~/three-effectcomposer/lib/shaderpass.js","webpack:///./~/three-effectcomposer/lib/maskpass.js","webpack:///./~/three-effectcomposer/lib/clearmaskpass.js","webpack:///./src/glsl/pass-vert.glsl","webpack:///./src/glsl/minion.frag.glsl","webpack:///./src/glsl/rayMarch-frag.glsl","webpack:///./index.html","webpack:///./~/three-orbit-controls/index.js"],"names":["require","THREE","OrbitControls","BoxGeometry","SphereGeometry","ConeGeometry","PlaneGeometry","TorusGeometry","Math","PI","CylinderGeometry","Engine","time","deltaTime","clock","window","addEventListener","stats","setMode","domElement","style","position","left","top","document","body","appendChild","scene","Scene","camera","PerspectiveCamera","innerWidth","innerHeight","renderer","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","Clock","controls","enableDamping","enableZoom","rotateSpeed","zoomSpeed","panSpeed","fov","updateProjectionMatrix","aspect","gui","GUI","options","strategy","debug","add","AxisHelper","DirectionalLight","proxyGeometry","boxMesh","Mesh","userData","geoType","sphereMesh","coneMesh","cylinderMesh","planeMesh","torusMesh","g1","Group","rotateX","torusWrapper","set","onBeforeRender","scale","sin","y","x","z","cos","rotateZ","group","target","lookAt","Vector3","rayMarcher","tick","getDelta","cameraTime","update","begin","render","buffer","transforms","end","requestAnimationFrame","ProxyMaterial","MeshLambertMaterial","color","PROXY_BUFFER_SIZE","ProxyGeometry","bounds","_buffer","Float32Array","_transforms","mesh","children","length","computeBuffer","remove","t","i","child","worldToLocal","Matrix4","getInverse","matrixWorld","toArray","RayMarcher","EffectComposer","minionComposer","minionPass","ShaderPass","uniforms","gradientMap","type","value","u_buffer","u_count","u_debug","u_viewProjectionMatrix","u_cameraPosition","u_transforms","vertexShader","fragmentShader","renderToScreen","addPass","composer","shaderPass","txLoader","TextureLoader","load","texture","material","RenderPass","inverseProjectionMatrix","minionScene","updateMatrix","projectionMatrix","matrix","clone","multiply"],"mappings":"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EA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;A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A;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,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A,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA,sBAAqB,mGAAmG,aAAa,2CAA2C,mBAAmB,SAAS,KAAK,4BAA4B,YAAY,gBAAg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,6CAA4C;AAC5C,EAAC,4BAA4B;;AAE7B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yBAAwB,0BAA0B;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,sBAAsB;;AAE5D;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B;;;AAG3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC;;AAEvC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;A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EA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA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;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG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A,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,4CAA2C,OAAO;;AAElD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uDAAsD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AEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,s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A;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAqB,eAAe;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,qBAAqB;;AAEtC;;AAEA;;AAEA,kBAAiB,eAAe;;AAEhC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;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A;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,cAAc;;AAE7D,EAAC;;;;;;;;;;;;mBC9x0CuBkB,U;;AAFxB;;AAHA,KAAMrH,QAAQ,mBAAAD,CAAQ,CAAR,CAAd;AACA,KAAMuH,iBAAiB,mBAAAvH,CAAQ,CAAR,EAAgCC,KAAhC,CAAvB;;AAIe,UAASqH,UAAT,CAAoBrF,QAApB,EAA8BN,KAA9B,EAAqCE,MAArC,EAA6C;;AAExD,SAAI2F,iBAAiB,IAAID,cAAJ,CAAmBtF,QAAnB,CAArB;AACA,SAAIwF,aAAa,IAAIF,eAAeG,UAAnB,CAA8B;AAC3CC,mBAAU;AACNC,0BAAa,EAAEC,MAAM,GAAR,EAAaC,OAAO,IAApB,EADP;AAENC,uBAAU;AACNF,uBAAM,KADA;AAENC,wBAAO,IAAIvB,YAAJ;AAFD,cAFJ;AAMNyB,sBAAS;AACLH,uBAAM,GADD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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 584894f0ebabf4cd3bee","require('file-loader?name=[name].[ext]!../index.html');\r\n\r\nconst THREE = require('three');\r\nconst OrbitControls = require('three-orbit-controls')(THREE)\r\n\r\nimport DAT from 'dat-gui'\r\nimport Stats from 'stats-js'\r\nimport ProxyGeometry, {ProxyMaterial} from './proxy_geometry'\r\nimport RayMarcher from './rayMarching'\r\n\r\nvar BoxGeometry = new THREE.BoxGeometry(1, 1, 1);\r\nvar SphereGeometry = new THREE.SphereGeometry(1, 32, 32);\r\nvar ConeGeometry = new THREE.ConeGeometry(1, 1);\r\nvar PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 );\r\nvar TorusGeometry = new THREE.TorusGeometry( 1, .2, 16, 16, Math.PI * 2);\r\nvar CylinderGeometry = new THREE.CylinderGeometry( 1, 1, 2, 16, 17, false );\r\n\r\nvar Engine = \r\n{\r\n time : 0.0,\r\n deltaTime : 0.0,\r\n clock : null,\r\n}\r\n\r\nwindow.addEventListener('load', function() {\r\n var stats = new Stats();\r\n stats.setMode(1);\r\n stats.domElement.style.position = 'absolute';\r\n stats.domElement.style.left = '0px';\r\n stats.domElement.style.top = '0px';\r\n document.body.appendChild(stats.domElement);\r\n\r\n var scene = new THREE.Scene();\r\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\r\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n renderer.setClearColor(0x999999, 1.0);\r\n document.body.appendChild(renderer.domElement);\r\n\r\n Engine.clock = new THREE.Clock();\r\n\r\n var controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.enableZoom = true;\r\n controls.rotateSpeed = 0.3;\r\n controls.zoomSpeed = 1.0;\r\n controls.panSpeed = 2.0;\r\n\r\n camera.fov = 45;\r\n camera.updateProjectionMatrix();\r\n\r\n\r\n window.addEventListener('resize', function() {\r\n camera.aspect = window.innerWidth / window.innerHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n });\r\n\r\n var gui = new DAT.GUI();\r\n\r\n var options = {\r\n strategy: 'Banana',\r\n debug : false\r\n }\r\n\r\n gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Banana']);\r\n gui.add(options, 'debug');\r\n\r\n scene.add(new THREE.AxisHelper(20));\r\n scene.add(new THREE.DirectionalLight(0xffffff, 1));\r\n\r\n var proxyGeometry = new ProxyGeometry();\r\n\r\n var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial);\r\n boxMesh.userData = { geoType : 0 }\r\n\r\n var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial);\r\n sphereMesh.userData = { geoType : 1 }\r\n\r\n var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial);\r\n coneMesh.userData = { geoType : 2}\r\n\r\n var cylinderMesh = new THREE.Mesh(CylinderGeometry, ProxyMaterial);\r\n cylinderMesh.userData = { geoType : 5 }\r\n\r\n var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial);\r\n var torusMesh = new THREE.Mesh(TorusGeometry, ProxyMaterial);\r\n \r\n // These transformations need to be hidden\r\n var g1 = new THREE.Group();\r\n planeMesh.rotateX(Math.PI * -.5);\r\n g1.add(planeMesh);\r\n g1.userData = { geoType : 3 };\r\n\r\n var torusWrapper = new THREE.Group();\r\n torusMesh.rotateX(Math.PI * -.5);\r\n torusWrapper.add(torusMesh);\r\n torusWrapper.userData = { geoType : 4 };\r\n\r\n g1.position.set(0, -1, 0);\r\n boxMesh.position.set(-3, 0, 0);\r\n coneMesh.position.set(3, 0, 0);\r\n torusWrapper.position.set(0, 0, 4);\r\n cylinderMesh.position.set(4, 1, 4);\r\n\r\n coneMesh.onBeforeRender = function() { \r\n var scale = Math.sin(Engine.time) * .35 + 1\r\n coneMesh.scale.set(scale, scale, scale);\r\n }\r\n\r\n boxMesh.onBeforeRender = function() {\r\n boxMesh.position.y = Math.sin(Engine.time) * 2 + 1;\r\n };\r\n\r\n cylinderMesh.onBeforeRender = function() {\r\n cylinderMesh.position.y = Math.sin(Engine.time + 1.5) + 1;\r\n cylinderMesh.rotateX(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n sphereMesh.onBeforeRender = function() {\r\n sphereMesh.position.x = Math.sin(Engine.time + .5);\r\n sphereMesh.position.z = Math.cos(Engine.time + .5) - .5;\r\n sphereMesh.position.y = Math.sin(Engine.time + 2.3) - .5;\r\n };\r\n\r\n torusMesh.onBeforeRender = function() {\r\n torusWrapper.rotateZ(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n proxyGeometry.add(boxMesh);\r\n proxyGeometry.add(sphereMesh);\r\n proxyGeometry.add(coneMesh);\r\n proxyGeometry.add(g1);\r\n proxyGeometry.add(torusWrapper);\r\n proxyGeometry.add(cylinderMesh);\r\n\r\n scene.add(proxyGeometry.group);\r\n\r\n controls.target.set(0,1.5,0);\r\n\r\n camera.position.set(3, 3.5, 13);\r\n camera.lookAt(new THREE.Vector3(0,0,0));\r\n \r\n var rayMarcher = new RayMarcher(renderer, scene, camera);\r\n\r\n (function tick() {\r\n var deltaTime = Engine.clock.getDelta();\r\n\r\n Engine.time += deltaTime;\r\n Engine.cameraTime += deltaTime;\r\n Engine.deltaTime = deltaTime;\r\n\r\n controls.update();\r\n stats.begin();\r\n proxyGeometry.update();\r\n\r\n if (options.strategy === 'Proxy Geometry') {\r\n renderer.render(scene, camera);\r\n } else if (options.strategy === 'Ray Marching') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time);\r\n } else if (options.strategy === 'Banana') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time);\r\n }\r\n stats.end();\r\n requestAnimationFrame(tick);\r\n })();\r\n});\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 1\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 2\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 3\n// module chunks = 0","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 4\n// module chunks = 0","const THREE = require('three');\r\n\r\nexport var ProxyMaterial = new THREE.MeshLambertMaterial({\r\n color: 0xff0000\r\n});\r\n\r\nexport const PROXY_BUFFER_SIZE = 4;\r\n\r\nexport default class ProxyGeometry {\r\n constructor(bounds) {\r\n this.group = new THREE.Group();\r\n this._buffer = new Float32Array();\r\n this._transforms = new Float32Array();\r\n }\r\n\r\n add(mesh) {\r\n this.group.add(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n remove(mesh) {\r\n this.group.remove(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n update(t = 1/60) {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n\r\n // TODO: animate objects\r\n }\r\n this.computeBuffer();\r\n }\r\n\r\n computeBuffer() {\r\n const {children} = this.group;\r\n\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n this._buffer[PROXY_BUFFER_SIZE*i] = child.position.x;\r\n this._buffer[PROXY_BUFFER_SIZE*i+1] = child.position.y;\r\n this._buffer[PROXY_BUFFER_SIZE*i+2] = child.position.z;\r\n\r\n var worldToLocal = new THREE.Matrix4();\r\n worldToLocal.getInverse(child.matrixWorld);\r\n worldToLocal.toArray(this._transforms, i * 16);\r\n\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = child.userData.geoType;\r\n // if (child.geometry instanceof THREE.BoxGeometry) {\r\n // } else if (child.geometry instanceof THREE.SphereGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 1;\r\n // } else if (child.geometry instanceof THREE.ConeGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 2;\r\n // } else if (child.geometry instanceof THREE.PlaneGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 3;\r\n // } else if (child.geometry instanceof THREE.TorusGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 4;\r\n // } else if (child.geometry instanceof THREE.CylinderGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 5;\r\n // }\r\n }\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n\r\n get transforms()\r\n {\r\n return this._transforms;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/proxy_geometry.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tEventDispatcher.prototype = {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tvar REVISION = '84';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tvar textureId = 0;\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\t\tthis.x = ( m32 - m23 ) / s;\n\t\t\tthis.y = ( m13 - m31 ) / s;\n\t\t\tthis.z = ( m21 - m12 ) / s;\n\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\t\t\tthis.w = attribute.getW( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tWebGLRenderTarget.prototype = {\n\n\t\tconstructor: WebGLRenderTarget,\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\t\t\tvar w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ];\n\n\t\t\treturn this.divideScalar( w );\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCylindrical: function( c ) {\n\n\t\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\t\tthis.y = c.y;\n\t\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeShear: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, y, z, 0,\n\t\t\t\tx, 1, z, 0,\n\t\t\t\tx, y, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tif ( far === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"float 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}\\nvec2 ltcTextureCoords( const in GeometricContext geometry, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = (LUT_SIZE - 1.0)/LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5/LUT_SIZE;\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\\n\\tint config = 0;\\n\\tif ( L[0].z > 0.0 ) config += 1;\\n\\tif ( L[1].z > 0.0 ) config += 2;\\n\\tif ( L[2].z > 0.0 ) config += 4;\\n\\tif ( L[3].z > 0.0 ) config += 8;\\n\\tn = 0;\\n\\tif ( config == 0 ) {\\n\\t} else if ( config == 1 ) {\\n\\t\\tn = 3;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 2 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 3 ) {\\n\\t\\tn = 4;\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t\\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 4 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t} else if ( config == 5 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 6 ) {\\n\\t\\tn = 4;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 7 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 8 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = L[3];\\n\\t} else if ( config == 9 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t} else if ( config == 10 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 11 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 12 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t} else if ( config == 13 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = L[2];\\n\\t\\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t} else if ( config == 14 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t} else if ( config == 15 ) {\\n\\t\\tn = 4;\\n\\t}\\n\\tif ( n == 3 )\\n\\t\\tL[3] = L[0];\\n\\tif ( n == 4 )\\n\\t\\tL[4] = L[0];\\n}\\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\\n\\tfloat cosTheta = dot( v1, v2 );\\n\\tfloat theta = acos( cosTheta );\\n\\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\\n\\treturn res;\\n}\\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\\n\\trectPoints[0] = pos - halfWidth - halfHeight;\\n\\trectPoints[1] = pos + halfWidth - halfHeight;\\n\\trectPoints[2] = pos + halfWidth + halfHeight;\\n\\trectPoints[3] = pos - halfWidth + halfHeight;\\n}\\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tvec3 T1, T2;\\n\\tT1 = normalize(V - N * dot( V, N ));\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\\n\\tvec3 clippedRect[5];\\n\\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\\n\\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\\n\\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\\n\\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\\n\\tint n;\\n\\tclipQuadToHorizon(clippedRect, n);\\n\\tif ( n == 0 )\\n\\t\\treturn vec3( 0, 0, 0 );\\n\\tclippedRect[0] = normalize( clippedRect[0] );\\n\\tclippedRect[1] = normalize( clippedRect[1] );\\n\\tclippedRect[2] = normalize( clippedRect[2] );\\n\\tclippedRect[3] = normalize( clippedRect[3] );\\n\\tclippedRect[4] = normalize( clippedRect[4] );\\n\\tfloat sum = 0.0;\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\\n\\tif (n >= 4)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\\n\\tif (n == 5)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\\n\\tsum = max( 0.0, sum );\\n\\tvec3 Lo_i = vec3( sum, sum, sum );\\n\\treturn Lo_i;\\n}\\nvec3 Rect_Area_Light_Specular_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\\n\\t\\tconst in float roughness,\\n\\t\\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tvec2 uv = ltcTextureCoords( geometry, roughness );\\n\\tvec4 brdfLtcApproxParams, t;\\n\\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\\n\\tt = texture2D( ltcMat, uv );\\n\\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\\n\\tmat3 brdfLtcApproxMat = mat3(\\n\\t\\tvec3( 1, 0, t.y ),\\n\\t\\tvec3( 0, t.z, 0 ),\\n\\t\\tvec3( t.w, 0, t.x )\\n\\t);\\n\\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\\n\\tspecularReflectance *= brdfLtcScalar;\\n\\treturn specularReflectance;\\n}\\nvec3 Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tmat3 diffuseBrdfMat = mat3(1);\\n\\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\\n\\treturn diffuseReflectance;\\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\";\n\n\tvar 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\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, 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#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\n\tvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\n\tvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar 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};\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\\n\\t}\\n#endif\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff;\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar 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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#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\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar 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 ) * flipNormal;\\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\";\n\n\tvar 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\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar 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\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\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}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\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\\t#include \\n}\\n\";\n\n\tvar 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 \\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\\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\";\n\n\tvar 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 \\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\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\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\\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\";\n\n\tvar 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 \\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\";\n\n\tvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\n\tvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\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\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\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#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\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_vertex: fog_vertex,\n\t\tfog_pars_vertex: fog_pars_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\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 ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tgradientmap: {\n\n\t\t\tgradientMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} },\n\n\t\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\t\trectAreaLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\twidth: {},\n\t\t\t\theight: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.gradientmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tscale: { value: 1 },\n\t\t\t\t\tdashSize: { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\t\t\t\tlightPos: { value: new Vector3() }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tShaderLib.standard.uniforms,\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyMatrix4( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( fog.isFog ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar materialId = 0;\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tvar x = attribute.getX( i );\n\t\t\t\tvar y = attribute.getY( i );\n\t\t\t\tvar z = attribute.getZ( i );\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\treturn this.expandByObject( object );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function expandByObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box;\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tif ( box === undefined ) box = new Box3(); // see #10547\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( light && light.isPointLight ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\t// TODO (abelnation / sam-g-steel): is this needed?\n\t\t\t\tif (shadow && shadow.isRectAreaLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material && material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tvar object3DId = 0;\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\n\t\tthis.onBeforeRender = function () {};\n\t\tthis.onAfterRender = function () {};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject3D.prototype = {\n\n\t\tconstructor: Object3D,\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.layers.mask = source.layers.mask;\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\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\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int8Array( array ), itemSize );\n\n\t}\n\n\tInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\n\tfunction Uint8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8Array( array ), itemSize );\n\n\t}\n\n\tUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\n\tfunction Uint8ClampedBufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\n\tfunction Int16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int16Array( array ), itemSize );\n\n\t}\n\n\tInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\n\tfunction Uint16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint16Array( array ), itemSize );\n\n\t}\n\n\tUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\n\tfunction Int32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int32Array( array ), itemSize );\n\n\t}\n\n\tInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\n\tfunction Uint32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint32Array( array ), itemSize );\n\n\t}\n\n\tUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\n\tfunction Float32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float32Array( array ), itemSize );\n\n\t}\n\n\tFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\n\tfunction Float64BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float64Array( array ), itemSize );\n\n\t}\n\n\tFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, {\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex = undefined;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t// http://stackoverflow.com/questions/1669190/javascript-min-max-array-values/13440842#13440842\n\n\tfunction arrayMax( array ) {\n\n\t\tvar length = array.length, max = - Infinity;\n\n\t\twhile ( length -- ) {\n\n\t\t\tif ( array[ length ] > max ) {\n\n\t\t\t\tmax = array[ length ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn max;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tvar count = 0;\n\tfunction GeometryIdCount() { return count++; }\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tGeometry.prototype = {\n\n\t\tconstructor: Geometry,\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( ( geometry && geometry.isGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( ( mesh && mesh.isMesh ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar i, il, j, jl, k, kl;\n\n\t\t\t// reset\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.colors = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [[]];\n\t\t\tthis.morphTargets = [];\n\t\t\tthis.morphNormals = [];\n\t\t\tthis.skinWeights = [];\n\t\t\tthis.skinIndices = [];\n\t\t\tthis.lineDistances = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// vertices\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// face vertex uvs\n\n\t\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargets = source.morphTargets;\n\n\t\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = {};\n\t\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t\t// vertices\n\n\t\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// normals\n\n\t\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t\t// morph normals\n\n\t\t\tvar morphNormals = source.morphNormals;\n\n\t\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphNormal = {};\n\n\t\t\t\t// vertex normals\n\n\t\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// face normals\n\n\t\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t\t}\n\n\t\t\t// skin weights\n\n\t\t\tvar skinWeights = source.skinWeights;\n\n\t\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// skin indices\n\n\t\t\tvar skinIndices = source.skinIndices;\n\n\t\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// line distances\n\n\t\t\tvar lineDistances = source.lineDistances;\n\n\t\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// update flags\n\n\t\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tBufferGeometry.prototype = {\n\n\t\tconstructor: BufferGeometry,\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tif ( Array.isArray( index ) ) {\n\n\t\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tthis.index = index;\n\n\t\t\t}\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh ) {\n\n\t\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar position = this.attributes.position;\n\n\t\t\t\tif ( position ) {\n\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( ( geometry && geometry.isBufferGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// index\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tvar morphAttributes = source.morphAttributes;\n\n\t\t\tfor ( name in morphAttributes ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// draw range\n\n\t\t\tthis.drawRange.start = source.drawRange.start;\n\t\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uv ) {\n\n\t\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar intersection;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = ( material && material.isMultiMaterial );\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar uvs;\n\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar numberOfVertices = 0;\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth = width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar ix, iy;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar ix, iy;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else if ( index.array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\t\t\t\tsize = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t \n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\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 );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshToonMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( map.isTexture ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tvar type = gl.FLOAT;\n\t\t\tvar array = data.array;\n\n\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\ttype = gl.FLOAT;\n\n\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\ttype = gl.SHORT;\n\n\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\ttype = gl.INT;\n\n\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\ttype = gl.BYTE;\n\n\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t\t}\n\n\t\t\tattributeProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\t\tattributeProperties.type = type;\n\t\t\tattributeProperties.version = data.version;\n\n\t\t\tdata.onUploadCallback();\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\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.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getAttributeProperties( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data );\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute );\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetAttributeProperties: getAttributeProperties,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\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 );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar version = parseFloat( /^WebGL\\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );\n\t\tvar lineWidthAvailable = parseFloat( version ) >= 1.0;\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\t\t\tdepthBuffer.setClear( 1 );\n\t\t\tstencilBuffer.setClear( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t\t// internal state cache\n\n\t\t\t_currentProgram = null,\n\t\t\t_currentRenderTarget = null,\n\t\t\t_currentFramebuffer = null,\n\t\t\t_currentMaterialId = - 1,\n\t\t\t_currentGeometryProgram = '',\n\t\t\t_currentCamera = null,\n\n\t\t\t_currentScissor = new Vector4(),\n\t\t\t_currentScissorTest = null,\n\n\t\t\t_currentViewport = new Vector4(),\n\n\t\t\t//\n\n\t\t\t_usedTextureUnits = 0,\n\n\t\t\t//\n\n\t\t\t_clearColor = new Color( 0x000000 ),\n\t\t\t_clearAlpha = 0,\n\n\t\t\t_width = _canvas.width,\n\t\t\t_height = _canvas.height,\n\n\t\t\t_pixelRatio = 1,\n\n\t\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissorTest = false,\n\n\t\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t\t// frustum\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t// clipping\n\n\t\t\t_clipping = new WebGLClipping(),\n\t\t\t_clippingEnabled = false,\n\t\t\t_localClippingEnabled = false,\n\n\t\t\t_sphere = new Sphere(),\n\n\t\t\t// camera matrices cache\n\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_vector3 = new Vector3(),\n\t\t\t_matrix4 = new Matrix4(),\n\t\t\t_matrix42 = new Matrix4(),\n\n\t\t\t// light arrays cache\n\n\t\t\t_lights = {\n\n\t\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\trectArea: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\t\tshadows: []\n\n\t\t\t},\n\n\t\t\t// info\n\n\t\t\t_infoRender = {\n\n\t\t\t\tcalls: 0,\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0,\n\t\t\t\tpoints: 0\n\n\t\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundPlaneCamera, backgroundPlaneMesh;\n\t\tvar backgroundBoxCamera, backgroundBoxMesh;\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\t\tmaterial.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\t\tvar attributeProperties = objects.getAttributeProperties( geometryAttribute );\n\n\t\t\t\t\t\tvar buffer = attributeProperties.__webglBuffer;\n\t\t\t\t\t\tvar type = attributeProperties.type;\n\t\t\t\t\t\tvar bytesPerElement = attributeProperties.bytesPerElement;\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tstate.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tif ( backgroundBoxCamera === undefined ) {\n\n\t\t\t\t\tbackgroundBoxCamera = new PerspectiveCamera();\n\n\t\t\t\t\tbackgroundBoxMesh = new Mesh(\n\t\t\t\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\t\tfog: false\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );\n\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tif ( backgroundPlaneCamera === undefined ) {\n\n\t\t\t\t\tbackgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\t\tbackgroundPlaneMesh = new Mesh(\n\t\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t\t! material.isRawShaderMaterial ||\n\t\t\t\tmaterial.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.rectAreaLights.value = _lights.rectArea;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isMeshNormalMaterial ||\n\t\t\t\t\tmaterial.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// RectAreaLight Texture\n\t\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\t\tif ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE;\n\t\t\t\tif ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE;\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t\tif ( material.gradientMap ) {\n\n\t\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\t\tr = 0, g = 0, b = 0,\n\t\t\t\tcolor,\n\t\t\t\tintensity,\n\t\t\t\tdistance,\n\t\t\t\tshadowMap,\n\n\t\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\trectAreaLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\t// (a) intensity controls irradiance of entire light\n\t\t\t\t\tuniforms.color\n\t\t\t\t\t\t.copy( color )\n\t\t\t\t\t\t.multiplyScalar( intensity / ( light.width * light.height ) );\n\n\t\t\t\t\t// (b) intensity controls the radiance per light area\n\t\t\t\t\t// uniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\t\t_matrix42.identity();\n\t\t\t\t\t_matrix4.copy( light.matrixWorld );\n\t\t\t\t\t_matrix4.premultiply( viewMatrix );\n\t\t\t\t\t_matrix42.extractRotation( _matrix4 );\n\n\t\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\t\tuniforms.halfWidth.applyMatrix4( _matrix42 );\n\t\t\t\t\tuniforms.halfHeight.applyMatrix4( _matrix42 );\n\n\t\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\t\t_lights.rectArea[ rectAreaLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.rectArea.length = rectAreaLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t// TODO (sam-g-steel) why aren't we using join\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar i, j, l, o, ol;\n\t\tvar edge = [ 0, 0 ], edges = {}, e;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\t\tvar vertex;\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tvar position, indices, groups;\n\t\t\tvar group, start, count;\n\t\t\tvar index1, index2;\n\n\t\t\tvertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\t\t\t\tindices = geometry.index;\n\t\t\t\tgroups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.count );\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\t\tstart = group.start;\n\t\t\t\t\tcount = group.count;\n\n\t\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices.getX( i + j );\n\t\t\t\t\t\t\tedge[ 1 ] = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( key in edges ) {\n\n\t\t\t\t\te = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\n\t\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tvar v = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tvar u = j / slices;\n\n\t\t\t\tvar p = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\tvar a = i * sliceCount + j;\n\t\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tvar azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\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\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\t r, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, j;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\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.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // curve to extrude shape along\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( ( font && font.isFont ) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar ix, iy;\n\n\t\tvar index = 0;\n\t\tvar grid = [];\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = iy / heightSegments;\n\n\t\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tvar u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// some helper variables\n\n\t\tvar segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t */\n\n\tfunction ShapeGeometry( shapes, curveSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tcurveSegments = curveSegments || 12;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar groupStart = 0;\n\t\tvar groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tvar i, l, shapeHole;\n\n\t\t\tvar indexOffset = vertices.length / 3;\n\t\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\t\tvar shapeVertices = points.shape;\n\t\t\tvar shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t\t// also check if holes are in the opposite direction\n\n\t\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\t\tvar edge = [ 0, 0 ], edges = {};\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t\t// prepare source geometry\n\n\t\tvar geometry2;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar sourceVertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tkey = edge.toString();\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\tvar e = edges[ key ];\n\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar index = 0;\n\t\tvar indexOffset = 0;\n\t\tvar indexArray = [];\n\t\tvar halfHeight = height / 2;\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\n\t\t\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, s;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tShapeBufferGeometry: ShapeBufferGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tBoxGeometry: BoxGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = Array.isArray( materials ) ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author takahirox / http://github.com/takahirox\n\t *\n\t * parameters = {\n\t * gradientMap: new THREE.Texture( )\n\t * }\n\t */\n\n\tfunction MeshToonMaterial( parameters ) {\n\n\t\tMeshPhongMaterial.call( this );\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.gradientMap = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\n\tMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\n\tMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\n\tMeshToonMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshToonMaterial: MeshToonMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FileLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FileLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { type: mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMimeType: function ( value ) {\n\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tfunction DataTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( DataTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\t\timage.addEventListener( 'load', function () {\n\n\t\t\t\tCache.add( url, this );\n\n\t\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\t/*\n\t\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t\t}, false );\n\t\t\t*/\n\n\t\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\timage.src = url;\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function ( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function () {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function () {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function ( timeOffset ) {\n\n\t\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function ( timeScale ) {\n\n\t\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function ( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== - 1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function () {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif ( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function () {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0; m !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar BlendingMode = {\n\t\t\t\tNoBlending: NoBlending,\n\t\t\t\tNormalBlending: NormalBlending,\n\t\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\t\tCustomBlending: CustomBlending\n\t\t\t};\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\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.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = null;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tscope.parse( json, onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tvar TextureMapping = {\n\t\t\t\tUVMapping: UVMapping,\n\t\t\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\t\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\t\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\t\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\t\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\t\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\t\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t\t\t};\n\n\t\t\tvar TextureWrapping = {\n\t\t\t\tRepeatWrapping: RepeatWrapping,\n\t\t\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\t\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t\t\t};\n\n\t\t\tvar TextureFilter = {\n\t\t\t\tNearestFilter: NearestFilter,\n\t\t\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\t\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\t\t\tLinearFilter: LinearFilter,\n\t\t\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\t\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t\t\t};\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.' );\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Bezier Curves formulas obtained from\n\t * http://en.wikipedia.org/wiki/Bézier_curve\n\t */\n\n\tfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\tvar t2 = t * t;\n\t\tvar t3 = t * t2;\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t}\n\n\t//\n\n\tfunction QuadraticBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * p;\n\n\t}\n\n\tfunction QuadraticBezierP1( t, p ) {\n\n\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t}\n\n\tfunction QuadraticBezierP2( t, p ) {\n\n\t\treturn t * t * p;\n\n\t}\n\n\tfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\t\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\t\tQuadraticBezierP2( t, p2 );\n\n\t}\n\n\t//\n\n\tfunction CubicBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * k * p;\n\n\t}\n\n\tfunction CubicBezierP1( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn 3 * k * k * t * p;\n\n\t}\n\n\tfunction CubicBezierP2( t, p ) {\n\n\t\treturn 3 * ( 1 - t ) * t * t * p;\n\n\t}\n\n\tfunction CubicBezierP3( t, p ) {\n\n\t\treturn t * t * t * p;\n\n\t}\n\n\tfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\t\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\t\tCubicBezierP3( t, p3 );\n\n\t}\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.CatmullRomCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\n\n\t\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function ( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\treturn new Vector2(\n\t\t\tCatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),\n\t\t\tCatmullRom( weight, point0.y, point1.y, point2.y, point3.y )\n\t\t);\n\n\t};\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector2(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector2(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\t **/\n\n\tfunction ShapePath() {\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tShapePath.prototype = {\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push( this.currentPath );\n\t\t\tthis.currentPath.moveTo( x, y );\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tthis.currentPath.lineTo( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts ) {\n\n\t\t\tthis.currentPath.splineThru( pts );\n\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\t\toffsetX = 0;\n\t\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [];\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tvar AudioContext = {\n\n\t\tgetContext: function () {\n\n\t\t\tif ( context === undefined ) {\n\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t\t}\n\n\t\t\treturn context;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = AudioContext.getContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction RectAreaLight ( color, intensity, width, height ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.position.set( 0, 1, 0 );\n\t\tthis.updateMatrix();\n\n\t\tthis.width = ( width !== undefined ) ? width : 10;\n\t\tthis.height = ( height !== undefined ) ? height : 10;\n\n\t\t// TODO (abelnation): distance/decay\n\n\t\t// TODO (abelnation): update method for RectAreaLight to update transform to lookat target\n\n\t\t// TODO (abelnation): shadows\n\t\t// this.shadow = new THREE.RectAreaLightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\t// TODO (abelnation): RectAreaLight update when light shape is changed\n\tRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: RectAreaLight,\n\n\t\tisRectAreaLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\t// this.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.loop = false;\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.buffer;\n\t\t\tsource.loop = this.loop;\n\t\t\tsource.onended = this.onEnded.bind( this );\n\t\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\t\tsource.start( 0, this.startTime );\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.loop = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.loop = this.loop;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tbufferType = Array;\n\t\t\t\tmixFunction = this._select;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:[\\w-]+[\\/:])*)([\\w-]+)?(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?\\.([\\w-]+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ],\n\t\t\t\t\tknownObject = undefined;\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis._loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tAnimationMixer.prototype = {\n\n\t\tconstructor: AnimationMixer,\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function () {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function ( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function () {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function ( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function ( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function ( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function ( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function ( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function () {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function ( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function ( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function () {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tUniform.prototype.clone = function () {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n\t *\n\t */\n\n\tfunction Cylindrical( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tCylindrical.prototype = {\n\n\t\tconstructor: Cylindrical,\n\n\t\tset: function ( radius, theta, y ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.theta = theta;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.theta = other.theta;\n\t\t\tthis.y = other.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\t\tthis.y = vec3.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = 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} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar color1 = new Color( 0, 0, 1 );\n\t\tvar color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( object && object.isBone ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar boneMatrix = new Matrix4();\n\t\tvar matrixWorldInv = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\t\tfor ( var i = 0, j = 0; i < this.bones.length; i ++ ) {\n\n\t\t\t\tvar bone = this.bones[ i ];\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tj += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t * @author Mugen87 / http://github.com/Mugen87\n\t */\n\n\tfunction RectAreaLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar materialFront = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false\n\t\t} );\n\n\t\tvar materialBack = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false,\n\t\t\twireframe: true\n\t\t} );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 6 * 3 ), 3 ) );\n\n\t\t// shows the \"front\" of the light, e.g. where light comes from\n\n\t\tthis.add( new Mesh( geometry, materialFront ) );\n\n\t\t// shows the \"back\" of the light, which does not emit light\n\n\t\tthis.add( new Mesh( geometry, materialBack ) );\n\n\t\tthis.update();\n\n\t}\n\n\tRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\n\tRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\n\tRectAreaLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\t\tthis.children[ 1 ].geometry.dispose();\n\t\tthis.children[ 1 ].material.dispose();\n\n\t};\n\n\tRectAreaLightHelper.prototype.update = function () {\n\n\t\tvar vector1 = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh1 = this.children[ 0 ];\n\t\t\tvar mesh2 = this.children[ 1 ];\n\n\t\t\tif ( this.light.target ) {\n\n\t\t\t\tvector1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\t\tvar lookVec = vector2.clone().sub( vector1 );\n\t\t\t\tmesh1.lookAt( lookVec );\n\t\t\t\tmesh2.lookAt( lookVec );\n\n\t\t\t}\n\n\t\t\t// update materials\n\n\t\t\tmesh1.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tmesh2.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// calculate new dimensions of the helper\n\n\t\t\tvar hx = this.light.width * 0.5;\n\t\t\tvar hy = this.light.height * 0.5;\n\n\t\t\t// because the buffer attribute is shared over both geometries, we only have to update once\n\n\t\t\tvar position = mesh1.geometry.getAttribute( 'position' );\n\t\t\tvar array = position.array;\n\n\t\t\t// first face\n\n\t\t\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\t\t\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\t\t\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\n\t\t\t// second face\n\n\t\t\tarray[ 9 ] = - hx; array[ 10 ] = hy; array[ 11 ] = 0;\n\t\t\tarray[ 12 ] = - hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\t\t\tarray[ 15 ] = hx; array[ 16 ] = - hy; array[ 17 ] = 0;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction HemisphereLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } );\n\n\t\tvar position = geometry.getAttribute( 'position' );\n\t\tvar colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar color1 = new Color();\n\t\tvar color2 = new Color();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh = this.children[ 0 ];\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tcolor2.copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tsize = size || 10;\n\t\tdivisions = divisions || 10;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = size / divisions;\n\t\tvar halfSize = size / 2;\n\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author Hectate / http://www.github.com/Hectate\n\t */\n\n\tfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\t\tradius = radius || 10;\n\t\tradials = radials || 16;\n\t\tcircles = circles || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar x, z;\n\t\tvar v, i, j, r, color;\n\n\t\t// create the radials\n\n\t\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * radius;\n\t\t\tz = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tr = radius - ( radius / circles * i );\n\n\t\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tPolarGridHelper.prototype = Object.create( LineSegments.prototype );\n\tPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new BufferGeometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar colorFrustum = new Color( 0xffaa00 );\n\t\tvar colorCone = new Color( 0xff0000 );\n\t\tvar colorUp = new Color( 0x00aaff );\n\t\tvar colorTarget = new Color( 0xffffff );\n\t\tvar colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", colorFrustum );\n\t\taddLine( \"n2\", \"n4\", colorFrustum );\n\t\taddLine( \"n4\", \"n3\", colorFrustum );\n\t\taddLine( \"n3\", \"n1\", colorFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", colorFrustum );\n\t\taddLine( \"f2\", \"f4\", colorFrustum );\n\t\taddLine( \"f4\", \"f3\", colorFrustum );\n\t\taddLine( \"f3\", \"f1\", colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", colorFrustum );\n\t\taddLine( \"n2\", \"f2\", colorFrustum );\n\t\taddLine( \"n3\", \"f3\", colorFrustum );\n\t\taddLine( \"n4\", \"f4\", colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", colorCone );\n\t\taddLine( \"p\", \"n2\", colorCone );\n\t\taddLine( \"p\", \"n3\", colorCone );\n\t\taddLine( \"p\", \"n4\", colorCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", colorUp );\n\t\taddLine( \"u2\", \"u3\", colorUp );\n\t\taddLine( \"u3\", \"u1\", colorUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", colorTarget );\n\t\taddLine( \"p\", \"c\", colorCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", colorCross );\n\t\taddLine( \"cn3\", \"cn4\", colorCross );\n\n\t\taddLine( \"cf1\", \"cf2\", colorCross );\n\t\taddLine( \"cf3\", \"cf4\", colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\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 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( object && object.isBox3 ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry;\n\tvar coneGeometry;\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( lineGeometry === undefined ) {\n\n\t\t\tlineGeometry = new BufferGeometry();\n\t\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t];\n\n\t\tvar colors = [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\n\t/*\n\tBased on an optimized c++ solution in\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t - http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tfunction CubicPoly() {\n\n\t\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tfunction init( x0, x1, t0, t1 ) {\n\n\t\t\tc0 = x0;\n\t\t\tc1 = t0;\n\t\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t\t},\n\n\t\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\t\tt1 *= dt1;\n\t\t\t\tt2 *= dt1;\n\n\t\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t\t},\n\n\t\t\tcalc: function ( t ) {\n\n\t\t\t\tvar t2 = t * t;\n\t\t\t\tvar t3 = t2 * t;\n\t\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar tmp = new Vector3();\n\tvar px = new CubicPoly();\n\tvar py = new CubicPoly();\n\tvar pz = new CubicPoly();\n\n\tfunction CatmullRomCurve3( p /* array of Vector3 */ ) {\n\n\t\tthis.points = p || [];\n\t\tthis.closed = false;\n\n\t}\n\n\tCatmullRomCurve3.prototype = Object.create( Curve.prototype );\n\tCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\n\tCatmullRomCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar l = points.length;\n\n\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\tvar point = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tp1 = points[ intPoint % l ];\n\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t}\n\n\t\treturn new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );\n\n\t};\n\n\tfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve3.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\n\tCubicBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector3(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\n\tQuadraticBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector3(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t};\n\n\tfunction LineCurve3( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve3.prototype = Object.create( Curve.prototype );\n\tLineCurve3.prototype.constructor = LineCurve3;\n\n\tLineCurve3.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar vector = new Vector3();\n\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\tvector.multiplyScalar( t );\n\t\tvector.add( this.v1 );\n\n\t\treturn vector;\n\n\t};\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction MeshFaceMaterial( materials ) {\n\n\t\tconsole.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' );\n\t\treturn new MultiMaterial( materials );\n\n\t}\n\n\tfunction PointCloud( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction Particle( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\treturn new Sprite( material );\n\n\t}\n\n\tfunction ParticleSystem( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction PointCloudMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleBasicMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleSystemMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction Vertex( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\n\t}\n\n\t//\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\treturn new Int8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\treturn new Uint8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\treturn new Int16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\treturn new Uint16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\treturn new Int32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\treturn new Uint32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\treturn new Float64BufferAttribute( array, itemSize );\n\n\t}\n\n\t//\n\n\tCurve.create = function ( construct, getPoint ) {\n\n\t\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\t\tconstruct.prototype = Object.create( Curve.prototype );\n\t\tconstruct.prototype.constructor = construct;\n\t\tconstruct.prototype.getPoint = getPoint;\n\n\t\treturn construct;\n\n\t};\n\n\t//\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction SplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction Spline( points ) {\n\n\t\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\tObject.assign( Spline.prototype, {\n\n\t\tinitFromArray: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t\t},\n\t\tgetControlPointsArray: function ( optionalTarget ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t\t},\n\t\treparametrizeByArcLength: function ( samplingCoef ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\t//\n\tfunction BoundingBoxHelper( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\treturn new BoxHelper( object, color );\n\n\t}\n\n\tfunction EdgesHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\tfunction WireframeHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\t//\n\n\tfunction XHRLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\treturn new FileLoader( manager );\n\n\t}\n\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\treturn new DataTextureLoader( manager );\n\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tLine3.prototype.center = function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t};\n\n\t_Math.random16 = function () {\n\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t};\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\textractPosition: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\n\t\t},\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\trotateAxis: function ( v ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\ttranslate: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t\t},\n\t\trotateX: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t\t},\n\t\trotateY: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t\t},\n\t\trotateZ: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t\t},\n\t\trotateByAxis: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t\t},\n\t\tmakeFrustum: function( left, right, bottom, top, near, far ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t\t}\n\n\t} );\n\n\tPlane.prototype.isIntersectionLine = function ( line ) {\n\n\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\treturn this.intersectsLine( line );\n\n\t};\n\n\tQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t};\n\n\tObject.assign( Ray.prototype, {\n\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\n\t\textrude: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tsetEulerFromRotationMatrix: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t\t},\n\t\tapplyProjection: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\t\treturn this.applyMatrix4( m );\n\n\t\t},\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tGeometry.prototype.computeTangents = function () {\n\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t};\n\n\tObject.assign( Object3D.prototype, {\n\n\t\tgetChildByName: function ( name ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\n\t\t},\n\t\trenderDepth: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\n\t\teulerOrder: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\n\t\tobjects: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\n\t\tlength: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\t\treturn this.array.length;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\n\t\taddIndex: function ( index ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\t\tif ( indexOffset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\n\t\t},\n\t\tclearDrawCalls: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\n\t\t},\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t\t},\n\t\tcomputeOffsets: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\n\t\tdynamic: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\n\t\twrapAround: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\t\tmetal: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\n\t\tderivatives: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\n\t\tsupportsFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\t\treturn this.capabilities.vertexTextures;\n\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\n\t\t},\n\t\tinitMaterial: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t\t},\n\t\taddPrePlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t\t},\n\t\taddPostPlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t\t},\n\t\tupdateShadowMap: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.enabled;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.cullFace;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\n\t\tcullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\t\twrapS: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tAudio.prototype.load = function ( file ) {\n\n\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\tvar scope = this;\n\t\tvar audioLoader = new AudioLoader();\n\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\tscope.setBuffer( buffer );\n\n\t\t} );\n\t\treturn this;\n\n\t};\n\n\tAudioAnalyser.prototype.getData = function () {\n\n\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\treturn this.getFrequencyData();\n\n\t};\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector() {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function () {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer() {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.Texture = Texture;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.FileLoader = FileLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.RectAreaLight = RectAreaLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.AudioContext = AudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Cylindrical = Cylindrical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.RectAreaLightHelper = RectAreaLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.PolarGridHelper = PolarGridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.Path = Path;\n\texports.ShapePath = ShapePath;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ShapeBufferGeometry = ShapeBufferGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshToonMaterial = MeshToonMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.Float64BufferAttribute = Float64BufferAttribute;\n\texports.Float32BufferAttribute = Float32BufferAttribute;\n\texports.Uint32BufferAttribute = Uint32BufferAttribute;\n\texports.Int32BufferAttribute = Int32BufferAttribute;\n\texports.Uint16BufferAttribute = Uint16BufferAttribute;\n\texports.Int16BufferAttribute = Int16BufferAttribute;\n\texports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\n\texports.Uint8BufferAttribute = Uint8BufferAttribute;\n\texports.Int8BufferAttribute = Int8BufferAttribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MeshFaceMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Particle;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.Spline = Spline;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.XHRLoader = XHRLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 6\n// module chunks = 0","const THREE = require('three');\r\nconst EffectComposer = require('three-effectcomposer')(THREE)\r\n\r\nimport {PROXY_BUFFER_SIZE} from './proxy_geometry'\r\n\r\nexport default function RayMarcher(renderer, scene, camera) {\r\n\r\n var minionComposer = new EffectComposer(renderer);\r\n var minionPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n gradientMap: { type: \"t\", value: null},\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/minion.frag.glsl')\r\n });\r\n minionPass.renderToScreen = true;\r\n minionComposer.addPass(minionPass);\r\n\r\n var composer = new EffectComposer(renderer);\r\n var shaderPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/rayMarch-frag.glsl')\r\n });\r\n shaderPass.renderToScreen = true;\r\n\r\n var txLoader = new THREE.TextureLoader();\r\n txLoader.load('./images/gradients.png', function(texture) {\r\n minionPass.material.uniforms.gradientMap.value = texture;\r\n });\r\n\r\n // Adding this composer we force updating the scene transformations\r\n composer.addPass(new EffectComposer.RenderPass(scene, camera));\r\n composer.addPass(shaderPass);\r\n\r\n var inverseProjectionMatrix = new THREE.Matrix4();\r\n\r\n return {\r\n render: function(buffer, transforms, camera, options, minionScene, time) \r\n {\r\n\r\n camera.updateMatrix();\r\n camera.updateProjectionMatrix();\r\n inverseProjectionMatrix.getInverse(camera.projectionMatrix);\r\n\r\n if(minionScene)\r\n {\r\n minionPass.material.uniforms.u_buffer.value = buffer;\r\n minionPass.material.uniforms.u_transforms.value = transforms;\r\n minionPass.material.uniforms.u_count.value = 0;\r\n minionPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n minionPass.material.uniforms.time.value = time;\r\n\r\n minionPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n minionPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n minionComposer.render();\r\n }\r\n else\r\n {\r\n shaderPass.material.uniforms.u_buffer.value = buffer;\r\n shaderPass.material.uniforms.u_transforms.value = transforms;\r\n shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE;\r\n shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n shaderPass.material.uniforms.time.value = time;\r\n\r\n shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n composer.render();\r\n } \r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/rayMarching.js","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n var CopyShader = EffectComposer.CopyShader = require('three-copyshader')\n , RenderPass = EffectComposer.RenderPass = require('./lib/renderpass')(THREE)\n , ShaderPass = EffectComposer.ShaderPass = require('./lib/shaderpass')(THREE, EffectComposer)\n , MaskPass = EffectComposer.MaskPass = require('./lib/maskpass')(THREE)\n , ClearMaskPass = EffectComposer.ClearMaskPass = require('./lib/clearmaskpass')(THREE)\n\n function EffectComposer( renderer, renderTarget ) {\n this.renderer = renderer;\n\n if ( renderTarget === undefined ) {\n var width = window.innerWidth || 1;\n var height = window.innerHeight || 1;\n var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\n renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n this.passes = [];\n\n this.copyPass = new ShaderPass( CopyShader );\n };\n\n EffectComposer.prototype = {\n swapBuffers: function() {\n\n var tmp = this.readBuffer;\n this.readBuffer = this.writeBuffer;\n this.writeBuffer = tmp;\n\n },\n\n addPass: function ( pass ) {\n\n this.passes.push( pass );\n\n },\n\n insertPass: function ( pass, index ) {\n\n this.passes.splice( index, 0, pass );\n\n },\n\n render: function ( delta ) {\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n var maskActive = false;\n\n var pass, i, il = this.passes.length;\n\n for ( i = 0; i < il; i ++ ) {\n\n pass = this.passes[ i ];\n\n if ( !pass.enabled ) continue;\n\n pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n if ( pass.needsSwap ) {\n\n if ( maskActive ) {\n\n var context = this.renderer.context;\n\n context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n }\n\n this.swapBuffers();\n\n }\n\n if ( pass instanceof MaskPass ) {\n\n maskActive = true;\n\n } else if ( pass instanceof ClearMaskPass ) {\n\n maskActive = false;\n\n }\n\n }\n\n },\n\n reset: function ( renderTarget ) {\n\n if ( renderTarget === undefined ) {\n\n renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = window.innerWidth;\n renderTarget.height = window.innerHeight;\n\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n },\n\n setSize: function ( width, height ) {\n\n var renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = width;\n renderTarget.height = height;\n\n this.reset( renderTarget );\n\n }\n\n };\n\n // shared ortho camera\n\n EffectComposer.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n EffectComposer.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\n EffectComposer.scene = new THREE.Scene();\n EffectComposer.scene.add( EffectComposer.quad );\n\n return EffectComposer\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/index.js\n// module id = 8\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nmodule.exports = {\n uniforms: {\n \"tDiffuse\": { type: \"t\", value: null },\n \"opacity\": { type: \"f\", value: 1.0 }\n },\n vertexShader: [\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vUv = uv;\",\n \"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n \"}\"\n ].join(\"\\n\"),\n fragmentShader: [\n \"uniform float opacity;\",\n\n \"uniform sampler2D tDiffuse;\",\n\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vec4 texel = texture2D( tDiffuse, vUv );\",\n \"gl_FragColor = opacity * texel;\",\n\n \"}\"\n ].join(\"\\n\")\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-copyshader/index.js\n// module id = 9\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function RenderPass( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n if (!(this instanceof RenderPass)) return new RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha);\n\n this.scene = scene;\n this.camera = camera;\n\n this.overrideMaterial = overrideMaterial;\n\n this.clearColor = clearColor;\n this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n this.oldClearColor = new THREE.Color();\n this.oldClearAlpha = 1;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n };\n\n RenderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n this.scene.overrideMaterial = this.overrideMaterial;\n\n if ( this.clearColor ) {\n\n this.oldClearColor.copy( renderer.getClearColor() );\n this.oldClearAlpha = renderer.getClearAlpha();\n\n renderer.setClearColor( this.clearColor, this.clearAlpha );\n\n }\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n if ( this.clearColor ) {\n\n renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n }\n\n this.scene.overrideMaterial = null;\n\n }\n\n };\n\n return RenderPass;\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/renderpass.js\n// module id = 10\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE, EffectComposer) {\n function ShaderPass( shader, textureID ) {\n if (!(this instanceof ShaderPass)) return new ShaderPass(shader, textureID);\n\n this.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n this.material = new THREE.ShaderMaterial( {\n\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader\n\n } );\n\n this.renderToScreen = false;\n\n this.enabled = true;\n this.needsSwap = true;\n this.clear = false;\n\n };\n\n ShaderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n if ( this.uniforms[ this.textureID ] ) {\n\n this.uniforms[ this.textureID ].value = readBuffer;\n\n }\n\n EffectComposer.quad.material = this.material;\n\n if ( this.renderToScreen ) {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera );\n\n } else {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera, writeBuffer, this.clear );\n\n }\n\n }\n\n };\n\n return ShaderPass;\n\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/shaderpass.js\n// module id = 11\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function MaskPass( scene, camera ) {\n if (!(this instanceof MaskPass)) return new MaskPass(scene, camera);\n\n this.scene = scene;\n this.camera = camera;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n this.inverse = false;\n };\n\n MaskPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n var context = renderer.context;\n\n // don't update color or depth\n\n context.colorMask( false, false, false, false );\n context.depthMask( false );\n\n // set up stencil\n\n var writeValue, clearValue;\n\n if ( this.inverse ) {\n\n writeValue = 0;\n clearValue = 1;\n\n } else {\n\n writeValue = 1;\n clearValue = 0;\n\n }\n\n context.enable( context.STENCIL_TEST );\n context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n context.clearStencil( clearValue );\n\n // draw into the stencil buffer\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n renderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n // re-enable update of color and depth\n\n context.colorMask( true, true, true, true );\n context.depthMask( true );\n\n // only render where stencil is set to 1\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n context.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n }\n\n };\n\n return MaskPass\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/maskpass.js\n// module id = 12\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function ClearMaskPass() {\n if (!(this instanceof ClearMaskPass)) return new ClearMaskPass(scene, camera);\n this.enabled = true;\n };\n\n ClearMaskPass.prototype = {\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n var context = renderer.context;\n context.disable( context.STENCIL_TEST );\n }\n };\n\n return ClearMaskPass\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/clearmaskpass.js\n// module id = 13\n// module chunks = 0","module.exports = \"#define FAR_CLIP 1000.0\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayDir;\\r\\nvarying vec3 f_rayPos;\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nvoid main() {\\r\\n\\tvec2 tmp = vec2(uv.x, uv.y);\\r\\n tmp = (tmp * 2.0) - vec2(1.0);\\r\\n f_ndcP = vec4(tmp, 1.0, 1.0) * FAR_CLIP;\\r\\n f_uv = uv;\\r\\n\\r\\n f_rayDir = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - u_cameraPosition);\\r\\n f_rayPos = u_cameraPosition;\\r\\n\\r\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/pass-vert.glsl\n// module id = 14\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 32\\r\\n#define SECONDARY_ITERATIONS 2\\r\\n#define EPSILON 0.01\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .0075\\r\\n\\r\\n#define AO_ITERATIONS 4\\r\\n#define AO_DELTA .133\\r\\n#define AO_DECAY .8\\r\\n#define AO_INTENSITY .3\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 18\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .01\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nuniform sampler2D gradientMap;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: https://github.com/stackgl/glsl-smooth-min\\r\\nfloat smin(float a, float b, float k) \\r\\n{\\r\\n float res = exp(-k * a) + exp(-k * b);\\r\\n return -log(res) / k;\\r\\n}\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p, float r )\\r\\n{\\r\\n\\treturn length(p) - r;\\r\\n}\\r\\n\\r\\nfloat udBox(vec3 p, vec3 b)\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p, vec2 h)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - h;\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat pow8(float x)\\r\\n{\\r\\n\\tx *= x; // xˆ2\\r\\n\\tx *= x; // xˆ4\\r\\n\\treturn x * x;\\r\\n}\\r\\n\\r\\nfloat length8(vec2 v)\\r\\n{\\r\\n\\treturn pow(pow8(v.x) + pow8(v.y), .125);\\r\\n}\\r\\n// float wheelDistance(Point3 X, Point3 C, float r, float R) {\\r\\n// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R;\\r\\n// }\\r\\n\\r\\nfloat sdTorus82( vec3 p, vec2 t )\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-t.x,p.y);\\r\\n return length8(q)-t.y;\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat sdHexPrism( vec3 p, vec2 h )\\r\\n{\\r\\n vec3 q = abs(p);\\r\\n return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\\r\\n{\\r\\n vec3 pa = p - a, ba = b - a;\\r\\n float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\\r\\n return length( pa - ba*h ) - r;\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat sdEllipsoid( in vec3 p, in vec3 r )\\r\\n{\\r\\n return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\\r\\n}\\r\\n\\r\\nfloat opUnion( float d1, float d2 )\\r\\n{\\r\\n return min(d1, d2);\\r\\n}\\r\\n\\r\\nvec3 opCheapBend( vec3 p, float magnitude)\\r\\n{\\r\\n float c = cos(magnitude * p.y);\\r\\n float s = sin(magnitude * p.y);\\r\\n mat2 m = mat2(c, -s, s, c);\\r\\n vec3 q = vec3( m * p.xy, p.z);\\r\\n return q;\\r\\n}\\r\\n\\r\\nfloat repeatDimension(float x, float m, float extent)\\r\\n{\\r\\n\\treturn mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent));\\r\\n}\\r\\n\\r\\nfloat backgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5));\\r\\n\\tbase = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0));\\r\\n\\tbase = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5)));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat farBackgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat singleTrackSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(20.0, .3, .3));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\r\\n\\tvec3 detailP = point + vec3(0.0, 0.0, -0.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, udBox(detailP, vec3(.075, .3, .1)));\\r\\n\\r\\n\\tdetailP = point + vec3(0.5, .35, -.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\tdetailP = point + vec3(0.75, .35, .3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat clawSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(.65));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1)));\\r\\n\\r\\n\\tpoint += vec3(0.0, 4.45, 0.0);\\r\\n\\tbase = min(base, udBox(point, vec3(.3, .3, .3)));\\r\\n\\r\\n\\tbase = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0));\\r\\n\\tbase = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat tracksSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0));\\t\\r\\n\\r\\n\\t// Neverending claws\\r\\n\\tpoint.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0);\\r\\n\\tbase = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0)));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat railingSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2)));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5)));\\r\\n\\r\\n\\r\\n\\t// Railing bump map ;)\\r\\n\\tvec3 bumpPoint = point + vec3(0.0, 1.15, 0.0);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tbumpPoint = point + vec3(0.25, 1.15, 0.25);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tvec3 columnPoint = point + vec3(3.0, 1.25, -2.5);\\r\\n\\tcolumnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0));\\r\\n\\tcolumnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0));\\r\\n\\r\\n\\tfloat column = udBox(columnPoint, vec3(.35, 50.0, .35));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\r\\n\\tbase = min(base, column);\\r\\n\\r\\n\\tvec3 rep = vec3(1.0, 100.0, 10.0);\\r\\n\\r\\n\\tvec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy;\\r\\n\\tscrewPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5;\\r\\n\\tfloat screws1 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\tscrewPoint.y += 4.25;\\r\\n\\tfloat screws2 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\r\\n\\treturn min(min(base, screws1), screws2);\\r\\n}\\r\\n\\r\\nfloat minionBaseSDF(vec3 point)\\r\\n{\\r\\n\\tvec3 blendOffset = vec3(0.0, 1.5, 0.0);\\r\\n\\tvec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset;\\r\\n\\tvec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset;\\r\\n\\r\\n\\tfloat base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15);\\r\\n\\r\\n\\tfloat hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135);\\r\\n\\tfloat hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135);\\r\\n\\r\\n\\tfloat foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2);\\r\\n\\tfloat foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2);\\r\\n\\r\\n\\tfloat dist = smin(base, hand1, 5.0);\\r\\n\\tdist = smin(dist, hand2, 5.0);\\r\\n\\tdist = smin(dist, foot1, 5.0);\\r\\n\\tdist = smin(dist, foot2, 5.0);\\r\\n\\r\\n\\t// Left Hand\\r\\n\\tbendedPointSym.y -= .15;\\r\\n\\tfloat handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers (note: cylinders would make it better.. but no time!)\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase1);\\r\\n\\r\\n\\t// Right Hand\\r\\n\\tbendedPoint.y -= .15;\\r\\n\\tfloat handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase2);\\r\\n\\r\\n\\tvec3 glassPoint = point - vec3(0.0, 3.0, 1.15);\\t\\r\\n\\tfloat glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1));\\r\\n\\r\\n\\tfloat belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125));\\r\\n\\tbelt = max(belt, -sdSphere(glassPoint, .5));\\r\\n\\tglassBase = min(glassBase, belt);\\r\\n\\tdist = min(dist, glassBase);\\r\\n\\r\\n\\tdist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55));\\r\\n\\r\\n\\tfloat mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0));\\r\\n\\r\\n\\tdist = max(dist, -mouth);\\r\\n\\r\\n\\treturn dist;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\n// TODO: add material types\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial)\\r\\n{\\t\\r\\n\\thitMaterial = 0.0;\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n\\tfloat farBackground = farBackgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, farBackground);\\r\\n\\thitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001));\\r\\n\\r\\n\\tfloat minion = minionBaseSDF(point);\\r\\n\\tminDistance = min(minDistance, minion);\\r\\n\\thitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001));\\r\\n\\r\\n\\tfloat railing = railingSDF(point);\\r\\n\\tminDistance = min(minDistance, railing);\\r\\n\\thitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001));\\r\\n\\r\\n\\tfloat background = backgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, background);\\r\\n\\thitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001));\\r\\n\\t\\r\\n\\tfloat tracks = tracksSDF(point);\\r\\n\\tminDistance = min(minDistance, tracks);\\r\\n\\thitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001));\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\tminDistance = min(minDistance, minionBaseSDF(point));\\r\\n\\tminDistance = min(minDistance, railingSDF(point));\\r\\n\\tminDistance = min(minDistance, backgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, farBackgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, tracksSDF(point));\\r\\n\\treturn minDistance;\\t\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t, float material)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(1.0, 5.0, 7.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5;\\r\\n\\r\\n\\tfloat falloff = 40.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\tfloat facingRatio = dot(-ray.direction, normal);\\r\\n\\r\\n\\tvec4 g = texture2D(gradientMap, vec2((material * .2) + .1, facingRatio));\\r\\n\\r\\n\\tvec3 color = mix(g.rgb, vec3(diffuse), .15);\\r\\n\\r\\n\\treturn color * (shadow * ao * falloff);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n float hitMaterial = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d, hitMaterial);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t, hitMaterial);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/minion.frag.glsl\n// module id = 15\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n\\r\\n#define MAX_GEOMETRY_COUNT 50\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 64\\r\\n#define SECONDARY_ITERATIONS 3\\r\\n#define EPSILON 0.005\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .005\\r\\n\\r\\n#define AO_ITERATIONS 5\\r\\n#define AO_DELTA .1\\r\\n#define AO_DECAY .8\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 24\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .005\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform mat4 u_transforms[MAX_GEOMETRY_COUNT];\\r\\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\\r\\nuniform int u_count;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p )\\r\\n{\\r\\n\\treturn length(p) - 1.0;\\r\\n}\\r\\n\\r\\nfloat udBox( vec3 p)\\r\\n{\\r\\n\\treturn length(max(abs(p) - vec3(.5), 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0);\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform)\\r\\n{\\r\\n\\tvec3 rep = vec3(18.0, 100.0, 18.0);\\r\\n\\tpoint = mod(point + rep * .5, rep) - rep * .5;\\r\\n\\tvec3 localPoint = (transform * vec4(point, 1.0)).xyz;\\r\\n\\r\\n if(geo.w == 0.0)\\r\\n \\treturn udBox(localPoint);\\r\\n\\telse if(geo.w == 1.0)\\r\\n\\t\\treturn sdSphere(localPoint);\\r\\n\\telse if(geo.w == 2.0)\\r\\n\\t\\treturn sdCappedCone(localPoint * .5);\\r\\n\\telse if(geo.w == 3.0)\\r\\n\\t\\treturn sdPlane(localPoint);\\r\\n\\telse if(geo.w == 4.0)\\r\\n\\t\\treturn sdTorus(localPoint);\\r\\n\\telse if(geo.w == 5.0)\\r\\n\\t\\treturn sdCappedCylinder(localPoint);\\r\\n\\r\\n\\treturn FAR_CLIP;\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\r\\n \\tfor (int i = 0; i < MAX_GEOMETRY_COUNT; i++) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n\\r\\n return minDistance;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\\r\\n{\\t\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n \\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * .15, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(0.0, 4.0, 3.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0);\\r\\n\\tfloat shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\treturn vec3(diffuse * falloff * shadow * ao);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/rayMarch-frag.glsl\n// module id = 16\n// module chunks = 0","module.exports = __webpack_public_path__ + \"index.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/file-loader?name=[name].[ext]!./index.html\n// module id = 17\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\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\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 18\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file From a714050ea637bcb06f226e28f3dd6bcff90bf71c Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 04:54:10 -0500 Subject: [PATCH 19/26] * Removed textures --- src/glsl/minion.frag.glsl | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/glsl/minion.frag.glsl b/src/glsl/minion.frag.glsl index 465a911..59c507b 100644 --- a/src/glsl/minion.frag.glsl +++ b/src/glsl/minion.frag.glsl @@ -2,8 +2,8 @@ // As for most of these assignments, this is not intended to be a very optimal approach to this algorithm, // as I try to be as clear as possible for future reference #define FAR_CLIP 1000.0 -#define MAX_ITERATIONS 32 -#define SECONDARY_ITERATIONS 2 +#define MAX_ITERATIONS 36 +#define SECONDARY_ITERATIONS 3 #define EPSILON 0.01 #define NORMAL_ESTIMATION_EPSILON .0075 @@ -462,13 +462,7 @@ vec3 shade(vec3 point, Ray ray, float t, float material) float ao = evaluateAmbientOcclusion(point, normal); - float facingRatio = dot(-ray.direction, normal); - - vec4 g = texture2D(gradientMap, vec2((material * .2) + .1, facingRatio)); - - vec3 color = mix(g.rgb, vec3(diffuse), .15); - - return color * (shadow * ao * falloff); + return vec3(diffuse * shadow * ao * falloff); } void main() From 48a3d5527caf846df04b681806d53ec251b273a4 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Wed, 1 Mar 2017 04:54:31 -0500 Subject: [PATCH 20/26] * build --- build/bundle.js | 2 +- build/bundle.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/bundle.js b/build/bundle.js index ee5782d..ba6832e 100644 --- a/build/bundle.js +++ b/build/bundle.js @@ -48652,7 +48652,7 @@ /* 15 */ /***/ function(module, exports) { - module.exports = "// Note:\r\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\r\n// as I try to be as clear as possible for future reference\r\n#define FAR_CLIP 1000.0\r\n#define MAX_ITERATIONS 32\r\n#define SECONDARY_ITERATIONS 2\r\n#define EPSILON 0.01\r\n\r\n#define NORMAL_ESTIMATION_EPSILON .0075\r\n\r\n#define AO_ITERATIONS 4\r\n#define AO_DELTA .133\r\n#define AO_DECAY .8\r\n#define AO_INTENSITY .3\r\n\r\n// SHADOW PARAMETERS\r\n#define SHADOW_ITERATIONS 18\r\n#define SHADOW_SOFT_FACTOR 6.0\r\n#define SHADOW_EPSILON 0.00\r\n#define SHADOW_OFFSET .01\r\n\r\nstruct Ray {\r\n\tvec3 position;\r\n\tvec3 direction;\r\n};\r\n\r\nuniform mat4 u_viewProjectionMatrix;\r\nuniform vec3 u_cameraPosition;\r\n\r\nuniform float u_debug;\r\nuniform float time;\r\n\r\nuniform sampler2D gradientMap;\r\n\r\nvarying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\nvarying vec3 f_rayPos;\r\nvarying vec3 f_rayDir;\r\n\r\n// Reference: https://github.com/stackgl/glsl-smooth-min\r\nfloat smin(float a, float b, float k) \r\n{\r\n float res = exp(-k * a) + exp(-k * b);\r\n return -log(res) / k;\r\n}\r\n\r\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\r\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\r\n{\r\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\r\n}\r\n\r\nvec3 debugIterations(float factor)\r\n{\r\n\tvec3 a = vec3(0.478, 0.500, 0.500);\r\n\tvec3 b = vec3(0.500);\r\n\tvec3 c = vec3(0.688, 0.748, 0.748);\r\n\tvec3 d = vec3(0.318, 0.588, 0.908);\r\n\r\n\treturn palette(factor, a, b, c, d);\r\n}\r\n\r\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\r\n// But they are tweaked for their threejs equivalents\r\nfloat sdSphere( vec3 p, float r )\r\n{\r\n\treturn length(p) - r;\r\n}\r\n\r\nfloat udBox(vec3 p, vec3 b)\r\n{\r\n\treturn length(max(abs(p) - b, 0.0));\r\n}\r\n\r\n// TODO: build a parabola mixed with a plane to solve the \r\n// grazing angle/boundary iteration problem\r\nfloat sdPlane( vec3 p)\r\n{\r\n\treturn p.y;\r\n}\r\n\r\nfloat sdCappedCylinder( vec3 p, vec2 h)\r\n{\r\n vec2 d = abs(vec2(length(p.xz),p.y)) - h;\r\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\r\n}\r\n\r\nfloat pow8(float x)\r\n{\r\n\tx *= x; // xˆ2\r\n\tx *= x; // xˆ4\r\n\treturn x * x;\r\n}\r\n\r\nfloat length8(vec2 v)\r\n{\r\n\treturn pow(pow8(v.x) + pow8(v.y), .125);\r\n}\r\n// float wheelDistance(Point3 X, Point3 C, float r, float R) {\r\n// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R;\r\n// }\r\n\r\nfloat sdTorus82( vec3 p, vec2 t )\r\n{\r\n vec2 q = vec2(length(p.xz)-t.x,p.y);\r\n return length8(q)-t.y;\r\n}\r\n\r\nfloat sdTorus( vec3 p)\r\n{\r\n vec2 q = vec2(length(p.xz)-1.0,p.y);\r\n return length(q) - .2;\r\n}\r\n\r\nfloat sdHexPrism( vec3 p, vec2 h )\r\n{\r\n vec3 q = abs(p);\r\n return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\r\n}\r\n\r\nfloat udRoundBox( vec3 p, vec3 b, float r )\r\n{\r\n\treturn length(max(abs(p) - b, 0.0)) - r;\r\n}\r\n\r\nfloat sdCappedCone( in vec3 p)\r\n{\r\n\tp.y -= .25;\r\n vec2 q = vec2( length(p.xz), p.y );\r\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\r\n vec2 w = v - q;\r\n vec2 vv = vec2( dot(v,v), v.x*v.x );\r\n vec2 qv = vec2( dot(v,w), v.x*w.x );\r\n vec2 d = max(qv,0.0) * qv / vv;\r\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\r\n}\r\n\r\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\r\n{\r\n vec3 pa = p - a, ba = b - a;\r\n float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\r\n return length( pa - ba*h ) - r;\r\n}\r\n\r\nRay getRay(vec3 origin, vec3 dir)\r\n{\r\n\tRay ray;\r\n\tray.position = origin;\r\n\tray.direction = dir;\r\n\treturn ray;\r\n}\r\n\r\nfloat sdEllipsoid( in vec3 p, in vec3 r )\r\n{\r\n return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\r\n}\r\n\r\nfloat opUnion( float d1, float d2 )\r\n{\r\n return min(d1, d2);\r\n}\r\n\r\nvec3 opCheapBend( vec3 p, float magnitude)\r\n{\r\n float c = cos(magnitude * p.y);\r\n float s = sin(magnitude * p.y);\r\n mat2 m = mat2(c, -s, s, c);\r\n vec3 q = vec3( m * p.xy, p.z);\r\n return q;\r\n}\r\n\r\nfloat repeatDimension(float x, float m, float extent)\r\n{\r\n\treturn mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent));\r\n}\r\n\r\nfloat backgroundSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5));\r\n\tbase = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0));\r\n\tbase = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5)));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat farBackgroundSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5));\r\n\treturn base;\r\n}\r\n\r\nfloat singleTrackSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point, vec3(20.0, .3, .3));\r\n\tbase = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5)));\r\n\tbase = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5)));\r\n\r\n\tvec3 detailP = point + vec3(0.0, 0.0, -0.3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, udBox(detailP, vec3(.075, .3, .1)));\r\n\r\n\tdetailP = point + vec3(0.5, .35, -.3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, sdSphere(detailP, .1));\r\n\r\n\tdetailP = point + vec3(0.75, .35, .3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, sdSphere(detailP, .1));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat clawSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point, vec3(.65));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1)));\r\n\r\n\tpoint += vec3(0.0, 4.45, 0.0);\r\n\tbase = min(base, udBox(point, vec3(.3, .3, .3)));\r\n\r\n\tbase = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0));\r\n\tbase = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat tracksSDF(vec3 point)\r\n{\r\n\tfloat base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0));\t\r\n\r\n\t// Neverending claws\r\n\tpoint.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0);\r\n\tbase = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0)));\r\n\treturn base;\r\n}\r\n\r\nfloat railingSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2)));\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2)));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25)));\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5)));\r\n\r\n\r\n\t// Railing bump map ;)\r\n\tvec3 bumpPoint = point + vec3(0.0, 1.15, 0.0);\r\n\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\r\n\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\r\n\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0);\r\n\r\n\tbumpPoint = point + vec3(0.25, 1.15, 0.25);\r\n\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\r\n\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\r\n\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0);\r\n\r\n\tvec3 columnPoint = point + vec3(3.0, 1.25, -2.5);\r\n\tcolumnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0));\r\n\tcolumnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0));\r\n\r\n\tfloat column = udBox(columnPoint, vec3(.35, 50.0, .35));\r\n\tcolumn = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\r\n\tcolumn = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\r\n\r\n\tbase = min(base, column);\r\n\r\n\tvec3 rep = vec3(1.0, 100.0, 10.0);\r\n\r\n\tvec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy;\r\n\tscrewPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5;\r\n\tfloat screws1 = sdHexPrism(screwPoint, vec2(.1));\r\n\tscrewPoint.y += 4.25;\r\n\tfloat screws2 = sdHexPrism(screwPoint, vec2(.1));\r\n\r\n\treturn min(min(base, screws1), screws2);\r\n}\r\n\r\nfloat minionBaseSDF(vec3 point)\r\n{\r\n\tvec3 blendOffset = vec3(0.0, 1.5, 0.0);\r\n\tvec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset;\r\n\tvec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset;\r\n\r\n\tfloat base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15);\r\n\r\n\tfloat hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135);\r\n\tfloat hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135);\r\n\r\n\tfloat foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2);\r\n\tfloat foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2);\r\n\r\n\tfloat dist = smin(base, hand1, 5.0);\r\n\tdist = smin(dist, hand2, 5.0);\r\n\tdist = smin(dist, foot1, 5.0);\r\n\tdist = smin(dist, foot2, 5.0);\r\n\r\n\t// Left Hand\r\n\tbendedPointSym.y -= .15;\r\n\tfloat handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05));\r\n\thandBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\r\n\r\n\t// Base\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0);\r\n\r\n\t// Fingers (note: cylinders would make it better.. but no time!)\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0);\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0);\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0);\r\n\r\n\tdist = min(dist, handBase1);\r\n\r\n\t// Right Hand\r\n\tbendedPoint.y -= .15;\r\n\tfloat handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05));\r\n\thandBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\r\n\r\n\t// Base\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0);\r\n\r\n\t// Fingers\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0);\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0);\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0);\r\n\r\n\tdist = min(dist, handBase2);\r\n\r\n\tvec3 glassPoint = point - vec3(0.0, 3.0, 1.15);\t\r\n\tfloat glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1));\r\n\r\n\tfloat belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125));\r\n\tbelt = max(belt, -sdSphere(glassPoint, .5));\r\n\tglassBase = min(glassBase, belt);\r\n\tdist = min(dist, glassBase);\r\n\r\n\tdist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55));\r\n\r\n\tfloat mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0));\r\n\r\n\tdist = max(dist, -mouth);\r\n\r\n\treturn dist;\r\n}\r\n\r\n// Assumes minDistance was initialized to FAR_CLIP\r\n// TODO: add material types\r\nvoid evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial)\r\n{\t\r\n\thitMaterial = 0.0;\r\n\tminDistance = FAR_CLIP;\r\n\r\n\tfloat farBackground = farBackgroundSDF(point);\r\n\tminDistance = min(minDistance, farBackground);\r\n\thitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001));\r\n\r\n\tfloat minion = minionBaseSDF(point);\r\n\tminDistance = min(minDistance, minion);\r\n\thitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001));\r\n\r\n\tfloat railing = railingSDF(point);\r\n\tminDistance = min(minDistance, railing);\r\n\thitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001));\r\n\r\n\tfloat background = backgroundSDF(point);\r\n\tminDistance = min(minDistance, background);\r\n\thitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001));\r\n\t\r\n\tfloat tracks = tracksSDF(point);\r\n\tminDistance = min(minDistance, tracks);\r\n\thitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001));\r\n}\r\n\r\n// This method is useful for just the distance\r\nfloat evaluateSceneSDFSimple(vec3 point)\r\n{\r\n\tfloat minDistance = FAR_CLIP;\r\n\tminDistance = min(minDistance, minionBaseSDF(point));\r\n\tminDistance = min(minDistance, railingSDF(point));\r\n\tminDistance = min(minDistance, backgroundSDF(point));\r\n\tminDistance = min(minDistance, farBackgroundSDF(point));\r\n\tminDistance = min(minDistance, tracksSDF(point));\r\n\treturn minDistance;\t\r\n}\r\n\r\nvec3 estimateSceneGradient(vec3 point, float epsilon)\r\n{\r\n\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\r\n\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\r\n\r\n\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\r\n\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\r\n\r\n\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\r\n\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\r\n\r\n\treturn normalize(vec3(x,y,z));\r\n}\r\n\r\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\r\n// with tweaks\r\nfloat evaluateShadows(vec3 origin, vec3 toLight)\r\n{\r\n\tvec3 direction = toLight;\r\n\tfloat maxDistance = length(direction);\r\n\tdirection /= maxDistance;\r\n\r\n float t = SHADOW_EPSILON;\r\n float soft = .5;\r\n\r\n // WebGL doesnt like loops that cannot be easily unrolled\r\n\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\r\n\r\n\t\tif(d < SHADOW_EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\r\n\r\n\t\tif(t >= maxDistance)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t}\r\n\r\n\tsoft = clamp(soft * 2.0, 0.0, 1.0);\r\n\r\n\t// This is a mix of soft shadows and a fake AO\r\n\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\r\n}\r\n\r\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\r\n{\r\n\tfloat ao = 0.0;\r\n\tfloat delta = AO_DELTA;\r\n\tfloat decay = 1.0;\r\n\r\n\tfor(int i = 0; i < AO_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = float(i) * delta;\r\n\t\tdecay *= AO_DECAY;\r\n\t\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\r\n\t}\r\n\r\n\treturn clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0);\r\n}\r\n\r\nvec3 shade(vec3 point, Ray ray, float t, float material)\r\n{\r\n\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\r\n\r\n\tvec3 light = vec3(1.0, 5.0, 7.0);\r\n\tvec3 l = light - point;\r\n\r\n\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5;\r\n\r\n\tfloat falloff = 40.0 / pow(length(l) + EPSILON, 2.0);\r\n\tfloat shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0);\r\n\r\n\tfloat ao = evaluateAmbientOcclusion(point, normal);\r\n\r\n\tfloat facingRatio = dot(-ray.direction, normal);\r\n\r\n\tvec4 g = texture2D(gradientMap, vec2((material * .2) + .1, facingRatio));\r\n\r\n\tvec3 color = mix(g.rgb, vec3(diffuse), .15);\r\n\r\n\treturn color * (shadow * ao * falloff);\r\n}\r\n\r\nvoid main() \r\n{\r\n\t// Renormalize due to interpolation\r\n\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\r\n\r\n vec3 color;\r\n vec3 current = ray.position;\r\n\r\n float t = 0.0;\r\n\tfloat d = FAR_CLIP;\r\n float iterationCount = 0.0;\r\n float hitMaterial = 0.0;\r\n\r\n\tfor(int j = 0; j < MAX_ITERATIONS; j++)\r\n\t{\r\n\t\tevaluateSceneSDF(current, d, hitMaterial);\r\n\r\n\t\tif(d < EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t// More details in intersections (similar to a discontinuity reduction)\r\n\t// This GREATLY improves, for example, the gradient estimation for \r\n\t// big discontinuities such as box edges\r\n\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\r\n\t{\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\r\n\t\td = evaluateSceneSDFSimple(current);\r\n\t\t\r\n\t\tif(d <= 0.0)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\t}\r\n\r\n\tcolor = shade(current, ray, t, hitMaterial);\r\n\r\n\t// Gamma correction\r\n\tcolor = pow(color, vec3(.45454));\r\n\r\n\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\r\n\tcolor = mix(color, debugColor, u_debug);\r\n\r\n gl_FragColor = vec4(color, 1.0);\r\n}" + module.exports = "// Note:\r\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\r\n// as I try to be as clear as possible for future reference\r\n#define FAR_CLIP 1000.0\r\n#define MAX_ITERATIONS 36\r\n#define SECONDARY_ITERATIONS 3\r\n#define EPSILON 0.01\r\n\r\n#define NORMAL_ESTIMATION_EPSILON .0075\r\n\r\n#define AO_ITERATIONS 4\r\n#define AO_DELTA .133\r\n#define AO_DECAY .8\r\n#define AO_INTENSITY .3\r\n\r\n// SHADOW PARAMETERS\r\n#define SHADOW_ITERATIONS 18\r\n#define SHADOW_SOFT_FACTOR 6.0\r\n#define SHADOW_EPSILON 0.00\r\n#define SHADOW_OFFSET .01\r\n\r\nstruct Ray {\r\n\tvec3 position;\r\n\tvec3 direction;\r\n};\r\n\r\nuniform mat4 u_viewProjectionMatrix;\r\nuniform vec3 u_cameraPosition;\r\n\r\nuniform float u_debug;\r\nuniform float time;\r\n\r\nuniform sampler2D gradientMap;\r\n\r\nvarying vec2 f_uv;\r\nvarying vec4 f_ndcP;\r\n\r\nvarying vec3 f_rayPos;\r\nvarying vec3 f_rayDir;\r\n\r\n// Reference: https://github.com/stackgl/glsl-smooth-min\r\nfloat smin(float a, float b, float k) \r\n{\r\n float res = exp(-k * a) + exp(-k * b);\r\n return -log(res) / k;\r\n}\r\n\r\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\r\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\r\n{\r\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\r\n}\r\n\r\nvec3 debugIterations(float factor)\r\n{\r\n\tvec3 a = vec3(0.478, 0.500, 0.500);\r\n\tvec3 b = vec3(0.500);\r\n\tvec3 c = vec3(0.688, 0.748, 0.748);\r\n\tvec3 d = vec3(0.318, 0.588, 0.908);\r\n\r\n\treturn palette(factor, a, b, c, d);\r\n}\r\n\r\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\r\n// But they are tweaked for their threejs equivalents\r\nfloat sdSphere( vec3 p, float r )\r\n{\r\n\treturn length(p) - r;\r\n}\r\n\r\nfloat udBox(vec3 p, vec3 b)\r\n{\r\n\treturn length(max(abs(p) - b, 0.0));\r\n}\r\n\r\n// TODO: build a parabola mixed with a plane to solve the \r\n// grazing angle/boundary iteration problem\r\nfloat sdPlane( vec3 p)\r\n{\r\n\treturn p.y;\r\n}\r\n\r\nfloat sdCappedCylinder( vec3 p, vec2 h)\r\n{\r\n vec2 d = abs(vec2(length(p.xz),p.y)) - h;\r\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\r\n}\r\n\r\nfloat pow8(float x)\r\n{\r\n\tx *= x; // xˆ2\r\n\tx *= x; // xˆ4\r\n\treturn x * x;\r\n}\r\n\r\nfloat length8(vec2 v)\r\n{\r\n\treturn pow(pow8(v.x) + pow8(v.y), .125);\r\n}\r\n// float wheelDistance(Point3 X, Point3 C, float r, float R) {\r\n// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R;\r\n// }\r\n\r\nfloat sdTorus82( vec3 p, vec2 t )\r\n{\r\n vec2 q = vec2(length(p.xz)-t.x,p.y);\r\n return length8(q)-t.y;\r\n}\r\n\r\nfloat sdTorus( vec3 p)\r\n{\r\n vec2 q = vec2(length(p.xz)-1.0,p.y);\r\n return length(q) - .2;\r\n}\r\n\r\nfloat sdHexPrism( vec3 p, vec2 h )\r\n{\r\n vec3 q = abs(p);\r\n return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\r\n}\r\n\r\nfloat udRoundBox( vec3 p, vec3 b, float r )\r\n{\r\n\treturn length(max(abs(p) - b, 0.0)) - r;\r\n}\r\n\r\nfloat sdCappedCone( in vec3 p)\r\n{\r\n\tp.y -= .25;\r\n vec2 q = vec2( length(p.xz), p.y );\r\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\r\n vec2 w = v - q;\r\n vec2 vv = vec2( dot(v,v), v.x*v.x );\r\n vec2 qv = vec2( dot(v,w), v.x*w.x );\r\n vec2 d = max(qv,0.0) * qv / vv;\r\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\r\n}\r\n\r\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\r\n{\r\n vec3 pa = p - a, ba = b - a;\r\n float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\r\n return length( pa - ba*h ) - r;\r\n}\r\n\r\nRay getRay(vec3 origin, vec3 dir)\r\n{\r\n\tRay ray;\r\n\tray.position = origin;\r\n\tray.direction = dir;\r\n\treturn ray;\r\n}\r\n\r\nfloat sdEllipsoid( in vec3 p, in vec3 r )\r\n{\r\n return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\r\n}\r\n\r\nfloat opUnion( float d1, float d2 )\r\n{\r\n return min(d1, d2);\r\n}\r\n\r\nvec3 opCheapBend( vec3 p, float magnitude)\r\n{\r\n float c = cos(magnitude * p.y);\r\n float s = sin(magnitude * p.y);\r\n mat2 m = mat2(c, -s, s, c);\r\n vec3 q = vec3( m * p.xy, p.z);\r\n return q;\r\n}\r\n\r\nfloat repeatDimension(float x, float m, float extent)\r\n{\r\n\treturn mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent));\r\n}\r\n\r\nfloat backgroundSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5));\r\n\tbase = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0));\r\n\tbase = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5)));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat farBackgroundSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5));\r\n\treturn base;\r\n}\r\n\r\nfloat singleTrackSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point, vec3(20.0, .3, .3));\r\n\tbase = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5)));\r\n\tbase = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5)));\r\n\r\n\tvec3 detailP = point + vec3(0.0, 0.0, -0.3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, udBox(detailP, vec3(.075, .3, .1)));\r\n\r\n\tdetailP = point + vec3(0.5, .35, -.3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, sdSphere(detailP, .1));\r\n\r\n\tdetailP = point + vec3(0.75, .35, .3);\r\n\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\r\n\tbase = min(base, sdSphere(detailP, .1));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat clawSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point, vec3(.65));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1)));\r\n\r\n\tpoint += vec3(0.0, 4.45, 0.0);\r\n\tbase = min(base, udBox(point, vec3(.3, .3, .3)));\r\n\r\n\tbase = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0));\r\n\tbase = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65));\r\n\r\n\treturn base;\r\n}\r\n\r\nfloat tracksSDF(vec3 point)\r\n{\r\n\tfloat base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0));\t\r\n\r\n\t// Neverending claws\r\n\tpoint.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0);\r\n\tbase = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0)));\r\n\treturn base;\r\n}\r\n\r\nfloat railingSDF(vec3 point)\r\n{\r\n\tfloat base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2)));\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2)));\r\n\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25)));\r\n\tbase = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5)));\r\n\r\n\r\n\t// Railing bump map ;)\r\n\tvec3 bumpPoint = point + vec3(0.0, 1.15, 0.0);\r\n\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\r\n\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\r\n\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0);\r\n\r\n\tbumpPoint = point + vec3(0.25, 1.15, 0.25);\r\n\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\r\n\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\r\n\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0);\r\n\r\n\tvec3 columnPoint = point + vec3(3.0, 1.25, -2.5);\r\n\tcolumnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0));\r\n\tcolumnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0));\r\n\r\n\tfloat column = udBox(columnPoint, vec3(.35, 50.0, .35));\r\n\tcolumn = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\r\n\tcolumn = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\r\n\r\n\tbase = min(base, column);\r\n\r\n\tvec3 rep = vec3(1.0, 100.0, 10.0);\r\n\r\n\tvec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy;\r\n\tscrewPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5;\r\n\tfloat screws1 = sdHexPrism(screwPoint, vec2(.1));\r\n\tscrewPoint.y += 4.25;\r\n\tfloat screws2 = sdHexPrism(screwPoint, vec2(.1));\r\n\r\n\treturn min(min(base, screws1), screws2);\r\n}\r\n\r\nfloat minionBaseSDF(vec3 point)\r\n{\r\n\tvec3 blendOffset = vec3(0.0, 1.5, 0.0);\r\n\tvec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset;\r\n\tvec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset;\r\n\r\n\tfloat base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15);\r\n\r\n\tfloat hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135);\r\n\tfloat hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135);\r\n\r\n\tfloat foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2);\r\n\tfloat foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2);\r\n\r\n\tfloat dist = smin(base, hand1, 5.0);\r\n\tdist = smin(dist, hand2, 5.0);\r\n\tdist = smin(dist, foot1, 5.0);\r\n\tdist = smin(dist, foot2, 5.0);\r\n\r\n\t// Left Hand\r\n\tbendedPointSym.y -= .15;\r\n\tfloat handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05));\r\n\thandBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\r\n\r\n\t// Base\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0);\r\n\r\n\t// Fingers (note: cylinders would make it better.. but no time!)\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0);\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0);\r\n\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0);\r\n\r\n\tdist = min(dist, handBase1);\r\n\r\n\t// Right Hand\r\n\tbendedPoint.y -= .15;\r\n\tfloat handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05));\r\n\thandBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\r\n\r\n\t// Base\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0);\r\n\r\n\t// Fingers\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0);\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0);\r\n\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0);\r\n\r\n\tdist = min(dist, handBase2);\r\n\r\n\tvec3 glassPoint = point - vec3(0.0, 3.0, 1.15);\t\r\n\tfloat glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1));\r\n\r\n\tfloat belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125));\r\n\tbelt = max(belt, -sdSphere(glassPoint, .5));\r\n\tglassBase = min(glassBase, belt);\r\n\tdist = min(dist, glassBase);\r\n\r\n\tdist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55));\r\n\r\n\tfloat mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0));\r\n\r\n\tdist = max(dist, -mouth);\r\n\r\n\treturn dist;\r\n}\r\n\r\n// Assumes minDistance was initialized to FAR_CLIP\r\n// TODO: add material types\r\nvoid evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial)\r\n{\t\r\n\thitMaterial = 0.0;\r\n\tminDistance = FAR_CLIP;\r\n\r\n\tfloat farBackground = farBackgroundSDF(point);\r\n\tminDistance = min(minDistance, farBackground);\r\n\thitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001));\r\n\r\n\tfloat minion = minionBaseSDF(point);\r\n\tminDistance = min(minDistance, minion);\r\n\thitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001));\r\n\r\n\tfloat railing = railingSDF(point);\r\n\tminDistance = min(minDistance, railing);\r\n\thitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001));\r\n\r\n\tfloat background = backgroundSDF(point);\r\n\tminDistance = min(minDistance, background);\r\n\thitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001));\r\n\t\r\n\tfloat tracks = tracksSDF(point);\r\n\tminDistance = min(minDistance, tracks);\r\n\thitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001));\r\n}\r\n\r\n// This method is useful for just the distance\r\nfloat evaluateSceneSDFSimple(vec3 point)\r\n{\r\n\tfloat minDistance = FAR_CLIP;\r\n\tminDistance = min(minDistance, minionBaseSDF(point));\r\n\tminDistance = min(minDistance, railingSDF(point));\r\n\tminDistance = min(minDistance, backgroundSDF(point));\r\n\tminDistance = min(minDistance, farBackgroundSDF(point));\r\n\tminDistance = min(minDistance, tracksSDF(point));\r\n\treturn minDistance;\t\r\n}\r\n\r\nvec3 estimateSceneGradient(vec3 point, float epsilon)\r\n{\r\n\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\r\n\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\r\n\r\n\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\r\n\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\r\n\r\n\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\r\n\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\r\n\r\n\treturn normalize(vec3(x,y,z));\r\n}\r\n\r\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\r\n// with tweaks\r\nfloat evaluateShadows(vec3 origin, vec3 toLight)\r\n{\r\n\tvec3 direction = toLight;\r\n\tfloat maxDistance = length(direction);\r\n\tdirection /= maxDistance;\r\n\r\n float t = SHADOW_EPSILON;\r\n float soft = .5;\r\n\r\n // WebGL doesnt like loops that cannot be easily unrolled\r\n\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\r\n\r\n\t\tif(d < SHADOW_EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\r\n\r\n\t\tif(t >= maxDistance)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t}\r\n\r\n\tsoft = clamp(soft * 2.0, 0.0, 1.0);\r\n\r\n\t// This is a mix of soft shadows and a fake AO\r\n\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\r\n}\r\n\r\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\r\n{\r\n\tfloat ao = 0.0;\r\n\tfloat delta = AO_DELTA;\r\n\tfloat decay = 1.0;\r\n\r\n\tfor(int i = 0; i < AO_ITERATIONS; i++)\r\n\t{\r\n\t\tfloat d = float(i) * delta;\r\n\t\tdecay *= AO_DECAY;\r\n\t\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\r\n\t}\r\n\r\n\treturn clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0);\r\n}\r\n\r\nvec3 shade(vec3 point, Ray ray, float t, float material)\r\n{\r\n\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\r\n\r\n\tvec3 light = vec3(1.0, 5.0, 7.0);\r\n\tvec3 l = light - point;\r\n\r\n\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5;\r\n\r\n\tfloat falloff = 40.0 / pow(length(l) + EPSILON, 2.0);\r\n\tfloat shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0);\r\n\r\n\tfloat ao = evaluateAmbientOcclusion(point, normal);\r\n\r\n\treturn vec3(diffuse * shadow * ao * falloff);\r\n}\r\n\r\nvoid main() \r\n{\r\n\t// Renormalize due to interpolation\r\n\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\r\n\r\n vec3 color;\r\n vec3 current = ray.position;\r\n\r\n float t = 0.0;\r\n\tfloat d = FAR_CLIP;\r\n float iterationCount = 0.0;\r\n float hitMaterial = 0.0;\r\n\r\n\tfor(int j = 0; j < MAX_ITERATIONS; j++)\r\n\t{\r\n\t\tevaluateSceneSDF(current, d, hitMaterial);\r\n\r\n\t\tif(d < EPSILON)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t// More details in intersections (similar to a discontinuity reduction)\r\n\t// This GREATLY improves, for example, the gradient estimation for \r\n\t// big discontinuities such as box edges\r\n\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\r\n\t{\r\n\t\tif(t >= FAR_CLIP)\r\n\t\t\tbreak;\r\n\r\n\t\td = evaluateSceneSDFSimple(current);\r\n\t\t\r\n\t\tif(d <= 0.0)\r\n\t\t\tbreak;\r\n\r\n\t\tt += d;\r\n\t\tcurrent += ray.direction * d;\r\n\t\titerationCount += 1.0;\r\n\t}\r\n\r\n\tcolor = shade(current, ray, t, hitMaterial);\r\n\r\n\t// Gamma correction\r\n\tcolor = pow(color, vec3(.45454));\r\n\r\n\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\r\n\tcolor = mix(color, debugColor, u_debug);\r\n\r\n gl_FragColor = vec4(color, 1.0);\r\n}" /***/ }, /* 16 */ diff --git a/build/bundle.js.map b/build/bundle.js.map index 2edc36b..cbd0a92 100644 --- a/build/bundle.js.map +++ b/build/bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 584894f0ebabf4cd3bee","webpack:///./src/main.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./src/proxy_geometry.js","webpack:///./~/three/build/three.js","webpack:///./src/rayMarching.js","webpack:///./~/three-effectcomposer/index.js","webpack:///./~/three-copyshader/index.js","webpack:///./~/three-effectcomposer/lib/renderpass.js","webpack:///./~/three-effectcomposer/lib/shaderpass.js","webpack:///./~/three-effectcomposer/lib/maskpass.js","webpack:///./~/three-effectcomposer/lib/clearmaskpass.js","webpack:///./src/glsl/pass-vert.glsl","webpack:///./src/glsl/minion.frag.glsl","webpack:///./src/glsl/rayMarch-frag.glsl","webpack:///./index.html","webpack:///./~/three-orbit-controls/index.js"],"names":["require","THREE","OrbitControls","BoxGeometry","SphereGeometry","ConeGeometry","PlaneGeometry","TorusGeometry","Math","PI","CylinderGeometry","Engine","time","deltaTime","clock","window","addEventListener","stats","setMode","domElement","style","position","left","top","document","body","appendChild","scene","Scene","camera","PerspectiveCamera","innerWidth","innerHeight","renderer","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","Clock","controls","enableDamping","enableZoom","rotateSpeed","zoomSpeed","panSpeed","fov","updateProjectionMatrix","aspect","gui","GUI","options","strategy","debug","add","AxisHelper","DirectionalLight","proxyGeometry","boxMesh","Mesh","userData","geoType","sphereMesh","coneMesh","cylinderMesh","planeMesh","torusMesh","g1","Group","rotateX","torusWrapper","set","onBeforeRender","scale","sin","y","x","z","cos","rotateZ","group","target","lookAt","Vector3","rayMarcher","tick","getDelta","cameraTime","update","begin","render","buffer","transforms","end","requestAnimationFrame","ProxyMaterial","MeshLambertMaterial","color","PROXY_BUFFER_SIZE","ProxyGeometry","bounds","_buffer","Float32Array","_transforms","mesh","children","length","computeBuffer","remove","t","i","child","worldToLocal","Matrix4","getInverse","matrixWorld","toArray","RayMarcher","EffectComposer","minionComposer","minionPass","ShaderPass","uniforms","gradientMap","type","value","u_buffer","u_count","u_debug","u_viewProjectionMatrix","u_cameraPosition","u_transforms","vertexShader","fragmentShader","renderToScreen","addPass","composer","shaderPass","txLoader","TextureLoader","load","texture","material","RenderPass","inverseProjectionMatrix","minionScene","updateMatrix","projectionMatrix","matrix","clone","multiply"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;ACjCA;;;;AACA;;;;AACA;;;;AACA;;;;;;AARA,oBAAAA,CAAQ,EAAR;;AAEA,KAAMC,QAAQ,mBAAAD,CAAQ,CAAR,CAAd;AACA,KAAME,gBAAgB,mBAAAF,CAAQ,EAAR,EAAgCC,KAAhC,CAAtB;;AAOA,KAAIE,cAAc,IAAIF,MAAME,WAAV,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B,CAA5B,CAAlB;AACA,KAAIC,iBAAiB,IAAIH,MAAMG,cAAV,CAAyB,CAAzB,EAA4B,EAA5B,EAAgC,EAAhC,CAArB;AACA,KAAIC,eAAe,IAAIJ,MAAMI,YAAV,CAAuB,CAAvB,EAA0B,CAA1B,CAAnB;AACA,KAAIC,gBAAgB,IAAIL,MAAMK,aAAV,CAAyB,GAAzB,EAA8B,GAA9B,EAAmC,CAAnC,EAAsC,CAAtC,CAApB;AACA,KAAIC,gBAAgB,IAAIN,MAAMM,aAAV,CAAyB,CAAzB,EAA4B,EAA5B,EAAgC,EAAhC,EAAoC,EAApC,EAAwCC,KAAKC,EAAL,GAAU,CAAlD,CAApB;AACA,KAAIC,mBAAmB,IAAIT,MAAMS,gBAAV,CAA4B,CAA5B,EAA+B,CAA/B,EAAkC,CAAlC,EAAqC,EAArC,EAAyC,EAAzC,EAA6C,KAA7C,CAAvB;;AAEA,KAAIC,SACJ;AACEC,WAAO,GADT;AAEEC,gBAAY,GAFd;AAGEC,YAAQ;AAHV,EADA;;AAOAC,QAAOC,gBAAP,CAAwB,MAAxB,EAAgC,YAAW;AACvC,SAAIC,QAAQ,uBAAZ;AACAA,WAAMC,OAAN,CAAc,CAAd;AACAD,WAAME,UAAN,CAAiBC,KAAjB,CAAuBC,QAAvB,GAAkC,UAAlC;AACAJ,WAAME,UAAN,CAAiBC,KAAjB,CAAuBE,IAAvB,GAA8B,KAA9B;AACAL,WAAME,UAAN,CAAiBC,KAAjB,CAAuBG,GAAvB,GAA6B,KAA7B;AACAC,cAASC,IAAT,CAAcC,WAAd,CAA0BT,MAAME,UAAhC;;AAEA,SAAIQ,QAAQ,IAAI1B,MAAM2B,KAAV,EAAZ;AACA,SAAIC,SAAS,IAAI5B,MAAM6B,iBAAV,CAA6B,EAA7B,EAAiCf,OAAOgB,UAAP,GAAkBhB,OAAOiB,WAA1D,EAAuE,GAAvE,EAA4E,IAA5E,CAAb;AACA,SAAIC,WAAW,IAAIhC,MAAMiC,aAAV,CAAyB,EAAEC,WAAW,IAAb,EAAzB,CAAf;AACAF,cAASG,aAAT,CAAuBrB,OAAOsB,gBAA9B;AACAJ,cAASK,OAAT,CAAiBvB,OAAOgB,UAAxB,EAAoChB,OAAOiB,WAA3C;AACAC,cAASM,aAAT,CAAuB,QAAvB,EAAiC,GAAjC;AACAf,cAASC,IAAT,CAAcC,WAAd,CAA0BO,SAASd,UAAnC;;AAEAR,YAAOG,KAAP,GAAe,IAAIb,MAAMuC,KAAV,EAAf;;AAEA,SAAIC,WAAW,IAAIvC,aAAJ,CAAkB2B,MAAlB,EAA0BI,SAASd,UAAnC,CAAf;AACAsB,cAASC,aAAT,GAAyB,IAAzB;AACAD,cAASE,UAAT,GAAsB,IAAtB;AACAF,cAASG,WAAT,GAAuB,GAAvB;AACAH,cAASI,SAAT,GAAqB,GAArB;AACAJ,cAASK,QAAT,GAAoB,GAApB;;AAEAjB,YAAOkB,GAAP,GAAa,EAAb;AACAlB,YAAOmB,sBAAP;;AAGAjC,YAAOC,gBAAP,CAAwB,QAAxB,EAAkC,YAAW;AACzCa,gBAAOoB,MAAP,GAAgBlC,OAAOgB,UAAP,GAAoBhB,OAAOiB,WAA3C;AACAH,gBAAOmB,sBAAP;AACAf,kBAASK,OAAT,CAAiBvB,OAAOgB,UAAxB,EAAoChB,OAAOiB,WAA3C;AACH,MAJD;;AAMA,SAAIkB,MAAM,IAAI,iBAAIC,GAAR,EAAV;;AAEA,SAAIC,UAAU;AACVC,mBAAU,QADA;AAEVC,gBAAQ;AAFE,MAAd;;AAKAJ,SAAIK,GAAJ,CAAQH,OAAR,EAAiB,UAAjB,EAA6B,CAAC,gBAAD,EAAmB,cAAnB,EAAmC,QAAnC,CAA7B;AACAF,SAAIK,GAAJ,CAAQH,OAAR,EAAiB,OAAjB;;AAEAzB,WAAM4B,GAAN,CAAU,IAAItD,MAAMuD,UAAV,CAAqB,EAArB,CAAV;AACA7B,WAAM4B,GAAN,CAAU,IAAItD,MAAMwD,gBAAV,CAA2B,QAA3B,EAAqC,CAArC,CAAV;;AAEA,SAAIC,gBAAgB,8BAApB;;AAEA,SAAIC,UAAU,IAAI1D,MAAM2D,IAAV,CAAezD,WAAf,gCAAd;AACAwD,aAAQE,QAAR,GAAmB,EAAEC,SAAU,CAAZ,EAAnB;;AAEA,SAAIC,aAAa,IAAI9D,MAAM2D,IAAV,CAAexD,cAAf,gCAAjB;AACA2D,gBAAWF,QAAX,GAAsB,EAAEC,SAAU,CAAZ,EAAtB;;AAEA,SAAIE,WAAW,IAAI/D,MAAM2D,IAAV,CAAevD,YAAf,gCAAf;AACA2D,cAASH,QAAT,GAAoB,EAAEC,SAAU,CAAZ,EAApB;;AAEA,SAAIG,eAAe,IAAIhE,MAAM2D,IAAV,CAAelD,gBAAf,gCAAnB;AACAuD,kBAAaJ,QAAb,GAAwB,EAAEC,SAAU,CAAZ,EAAxB;;AAEA,SAAII,YAAY,IAAIjE,MAAM2D,IAAV,CAAetD,aAAf,gCAAhB;AACA,SAAI6D,YAAY,IAAIlE,MAAM2D,IAAV,CAAerD,aAAf,gCAAhB;;AAEA;AACA,SAAI6D,KAAK,IAAInE,MAAMoE,KAAV,EAAT;AACAH,eAAUI,OAAV,CAAkB9D,KAAKC,EAAL,GAAU,CAAC,EAA7B;AACA2D,QAAGb,GAAH,CAAOW,SAAP;AACAE,QAAGP,QAAH,GAAc,EAAEC,SAAU,CAAZ,EAAd;;AAEA,SAAIS,eAAe,IAAItE,MAAMoE,KAAV,EAAnB;AACAF,eAAUG,OAAV,CAAkB9D,KAAKC,EAAL,GAAU,CAAC,EAA7B;AACA8D,kBAAahB,GAAb,CAAiBY,SAAjB;AACAI,kBAAaV,QAAb,GAAwB,EAAEC,SAAU,CAAZ,EAAxB;;AAEAM,QAAG/C,QAAH,CAAYmD,GAAZ,CAAgB,CAAhB,EAAmB,CAAC,CAApB,EAAuB,CAAvB;AACAb,aAAQtC,QAAR,CAAiBmD,GAAjB,CAAqB,CAAC,CAAtB,EAAyB,CAAzB,EAA4B,CAA5B;AACAR,cAAS3C,QAAT,CAAkBmD,GAAlB,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B,CAA5B;AACAD,kBAAalD,QAAb,CAAsBmD,GAAtB,CAA0B,CAA1B,EAA6B,CAA7B,EAAgC,CAAhC;AACAP,kBAAa5C,QAAb,CAAsBmD,GAAtB,CAA0B,CAA1B,EAA6B,CAA7B,EAAgC,CAAhC;;AAEAR,cAASS,cAAT,GAA0B,YAAW;AACjC,aAAIC,QAAQlE,KAAKmE,GAAL,CAAShE,OAAOC,IAAhB,IAAwB,GAAxB,GAA8B,CAA1C;AACAoD,kBAASU,KAAT,CAAeF,GAAf,CAAmBE,KAAnB,EAA0BA,KAA1B,EAAiCA,KAAjC;AACH,MAHD;;AAKAf,aAAQc,cAAR,GAAyB,YAAW;AAChCd,iBAAQtC,QAAR,CAAiBuD,CAAjB,GAAqBpE,KAAKmE,GAAL,CAAShE,OAAOC,IAAhB,IAAwB,CAAxB,GAA4B,CAAjD;AACH,MAFD;;AAIAqD,kBAAaQ,cAAb,GAA8B,YAAW;AACrCR,sBAAa5C,QAAb,CAAsBuD,CAAtB,GAA0BpE,KAAKmE,GAAL,CAAShE,OAAOC,IAAP,GAAc,GAAvB,IAA8B,CAAxD;AACAqD,sBAAaK,OAAb,CAAqB3D,OAAOE,SAAP,GAAmBL,KAAKC,EAA7C;AACH,MAHD;;AAKAsD,gBAAWU,cAAX,GAA4B,YAAW;AACnCV,oBAAW1C,QAAX,CAAoBwD,CAApB,GAAwBrE,KAAKmE,GAAL,CAAShE,OAAOC,IAAP,GAAc,EAAvB,CAAxB;AACAmD,oBAAW1C,QAAX,CAAoByD,CAApB,GAAwBtE,KAAKuE,GAAL,CAASpE,OAAOC,IAAP,GAAc,EAAvB,IAA6B,EAArD;AACAmD,oBAAW1C,QAAX,CAAoBuD,CAApB,GAAwBpE,KAAKmE,GAAL,CAAShE,OAAOC,IAAP,GAAc,GAAvB,IAA8B,EAAtD;AACH,MAJD;;AAMAuD,eAAUM,cAAV,GAA2B,YAAW;AAClCF,sBAAaS,OAAb,CAAqBrE,OAAOE,SAAP,GAAmBL,KAAKC,EAA7C;AACH,MAFD;;AAIAiD,mBAAcH,GAAd,CAAkBI,OAAlB;AACAD,mBAAcH,GAAd,CAAkBQ,UAAlB;AACAL,mBAAcH,GAAd,CAAkBS,QAAlB;AACAN,mBAAcH,GAAd,CAAkBa,EAAlB;AACAV,mBAAcH,GAAd,CAAkBgB,YAAlB;AACAb,mBAAcH,GAAd,CAAkBU,YAAlB;;AAEAtC,WAAM4B,GAAN,CAAUG,cAAcuB,KAAxB;;AAEAxC,cAASyC,MAAT,CAAgBV,GAAhB,CAAoB,CAApB,EAAsB,GAAtB,EAA0B,CAA1B;;AAEA3C,YAAOR,QAAP,CAAgBmD,GAAhB,CAAoB,CAApB,EAAuB,GAAvB,EAA4B,EAA5B;AACA3C,YAAOsD,MAAP,CAAc,IAAIlF,MAAMmF,OAAV,CAAkB,CAAlB,EAAoB,CAApB,EAAsB,CAAtB,CAAd;;AAEA,SAAIC,aAAa,0BAAepD,QAAf,EAAyBN,KAAzB,EAAgCE,MAAhC,CAAjB;;AAEA,MAAC,SAASyD,IAAT,GAAgB;AACb,aAAIzE,YAAYF,OAAOG,KAAP,CAAayE,QAAb,EAAhB;;AAEA5E,gBAAOC,IAAP,IAAeC,SAAf;AACAF,gBAAO6E,UAAP,IAAqB3E,SAArB;AACAF,gBAAOE,SAAP,GAAmBA,SAAnB;;AAEA4B,kBAASgD,MAAT;AACAxE,eAAMyE,KAAN;AACAhC,uBAAc+B,MAAd;;AAEA,aAAIrC,QAAQC,QAAR,KAAqB,gBAAzB,EAA2C;AACvCpB,sBAAS0D,MAAT,CAAgBhE,KAAhB,EAAuBE,MAAvB;AACH,UAFD,MAEO,IAAIuB,QAAQC,QAAR,KAAqB,cAAzB,EAAyC;AAC5CgC,wBAAWM,MAAX,CAAkBjC,cAAckC,MAAhC,EAAwClC,cAAcmC,UAAtD,EAAkEhE,MAAlE,EAA0EuB,OAA1E,EAAmF,KAAnF,EAA0FzC,OAAOC,IAAjG;AACH,UAFM,MAEA,IAAIwC,QAAQC,QAAR,KAAqB,QAAzB,EAAmC;AACtCgC,wBAAWM,MAAX,CAAkBjC,cAAckC,MAAhC,EAAwClC,cAAcmC,UAAtD,EAAkEhE,MAAlE,EAA0EuB,OAA1E,EAAmF,IAAnF,EAAyFzC,OAAOC,IAAhG;AACH;AACDK,eAAM6E,GAAN;AACAC,+BAAsBT,IAAtB;AACH,MApBD;AAqBH,EA/ID,E;;;;;;ACxBA;AACA,8C;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;A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A;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,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A,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA,sBAAqB,mGAAmG,aAAa,2CAA2C,mBAAmB,SAAS,KAAK,4BAA4B,YAAY,gBAAg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,6CAA4C;AAC5C,EAAC,4BAA4B;;AAE7B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yBAAwB,0BAA0B;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,sBAAsB;;AAE5D;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B;;;AAG3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC;;AAEvC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;A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EA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA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;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG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A,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,4CAA2C,OAAO;;AAElD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uDAAsD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AEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,s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A;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAqB,eAAe;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,qBAAqB;;AAEtC;;AAEA;;AAEA,kBAAiB,eAAe;;AAEhC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;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A;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,cAAc;;AAE7D,EAAC;;;;;;;;;;;;mBC9x0CuBkB,U;;AAFxB;;AAHA,KAAMrH,QAAQ,mBAAAD,CAAQ,CAAR,CAAd;AACA,KAAMuH,iBAAiB,mBAAAvH,CAAQ,CAAR,EAAgCC,KAAhC,CAAvB;;AAIe,UAASqH,UAAT,CAAoBrF,QAApB,EAA8BN,KAA9B,EAAqCE,MAArC,EAA6C;;AAExD,SAAI2F,iBAAiB,IAAID,cAAJ,CAAmBtF,QAAnB,CAArB;AACA,SAAIwF,aAAa,IAAIF,eAAeG,UAAnB,CAA8B;AAC3CC,mBAAU;AACNC,0BAAa,EAAEC,MAAM,GAAR,EAAaC,OAAO,IAApB,EADP;AAENC,uBAAU;AACNF,uBAAM,KADA;AAENC,wBAAO,IAAIvB,YAAJ;AAFD,cAFJ;AAMNyB,sBAAS;AACLH,uBAAM,GADD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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 584894f0ebabf4cd3bee","require('file-loader?name=[name].[ext]!../index.html');\r\n\r\nconst THREE = require('three');\r\nconst OrbitControls = require('three-orbit-controls')(THREE)\r\n\r\nimport DAT from 'dat-gui'\r\nimport Stats from 'stats-js'\r\nimport ProxyGeometry, {ProxyMaterial} from './proxy_geometry'\r\nimport RayMarcher from './rayMarching'\r\n\r\nvar BoxGeometry = new THREE.BoxGeometry(1, 1, 1);\r\nvar SphereGeometry = new THREE.SphereGeometry(1, 32, 32);\r\nvar ConeGeometry = new THREE.ConeGeometry(1, 1);\r\nvar PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 );\r\nvar TorusGeometry = new THREE.TorusGeometry( 1, .2, 16, 16, Math.PI * 2);\r\nvar CylinderGeometry = new THREE.CylinderGeometry( 1, 1, 2, 16, 17, false );\r\n\r\nvar Engine = \r\n{\r\n time : 0.0,\r\n deltaTime : 0.0,\r\n clock : null,\r\n}\r\n\r\nwindow.addEventListener('load', function() {\r\n var stats = new Stats();\r\n stats.setMode(1);\r\n stats.domElement.style.position = 'absolute';\r\n stats.domElement.style.left = '0px';\r\n stats.domElement.style.top = '0px';\r\n document.body.appendChild(stats.domElement);\r\n\r\n var scene = new THREE.Scene();\r\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\r\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n renderer.setClearColor(0x999999, 1.0);\r\n document.body.appendChild(renderer.domElement);\r\n\r\n Engine.clock = new THREE.Clock();\r\n\r\n var controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.enableZoom = true;\r\n controls.rotateSpeed = 0.3;\r\n controls.zoomSpeed = 1.0;\r\n controls.panSpeed = 2.0;\r\n\r\n camera.fov = 45;\r\n camera.updateProjectionMatrix();\r\n\r\n\r\n window.addEventListener('resize', function() {\r\n camera.aspect = window.innerWidth / window.innerHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n });\r\n\r\n var gui = new DAT.GUI();\r\n\r\n var options = {\r\n strategy: 'Banana',\r\n debug : false\r\n }\r\n\r\n gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Banana']);\r\n gui.add(options, 'debug');\r\n\r\n scene.add(new THREE.AxisHelper(20));\r\n scene.add(new THREE.DirectionalLight(0xffffff, 1));\r\n\r\n var proxyGeometry = new ProxyGeometry();\r\n\r\n var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial);\r\n boxMesh.userData = { geoType : 0 }\r\n\r\n var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial);\r\n sphereMesh.userData = { geoType : 1 }\r\n\r\n var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial);\r\n coneMesh.userData = { geoType : 2}\r\n\r\n var cylinderMesh = new THREE.Mesh(CylinderGeometry, ProxyMaterial);\r\n cylinderMesh.userData = { geoType : 5 }\r\n\r\n var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial);\r\n var torusMesh = new THREE.Mesh(TorusGeometry, ProxyMaterial);\r\n \r\n // These transformations need to be hidden\r\n var g1 = new THREE.Group();\r\n planeMesh.rotateX(Math.PI * -.5);\r\n g1.add(planeMesh);\r\n g1.userData = { geoType : 3 };\r\n\r\n var torusWrapper = new THREE.Group();\r\n torusMesh.rotateX(Math.PI * -.5);\r\n torusWrapper.add(torusMesh);\r\n torusWrapper.userData = { geoType : 4 };\r\n\r\n g1.position.set(0, -1, 0);\r\n boxMesh.position.set(-3, 0, 0);\r\n coneMesh.position.set(3, 0, 0);\r\n torusWrapper.position.set(0, 0, 4);\r\n cylinderMesh.position.set(4, 1, 4);\r\n\r\n coneMesh.onBeforeRender = function() { \r\n var scale = Math.sin(Engine.time) * .35 + 1\r\n coneMesh.scale.set(scale, scale, scale);\r\n }\r\n\r\n boxMesh.onBeforeRender = function() {\r\n boxMesh.position.y = Math.sin(Engine.time) * 2 + 1;\r\n };\r\n\r\n cylinderMesh.onBeforeRender = function() {\r\n cylinderMesh.position.y = Math.sin(Engine.time + 1.5) + 1;\r\n cylinderMesh.rotateX(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n sphereMesh.onBeforeRender = function() {\r\n sphereMesh.position.x = Math.sin(Engine.time + .5);\r\n sphereMesh.position.z = Math.cos(Engine.time + .5) - .5;\r\n sphereMesh.position.y = Math.sin(Engine.time + 2.3) - .5;\r\n };\r\n\r\n torusMesh.onBeforeRender = function() {\r\n torusWrapper.rotateZ(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n proxyGeometry.add(boxMesh);\r\n proxyGeometry.add(sphereMesh);\r\n proxyGeometry.add(coneMesh);\r\n proxyGeometry.add(g1);\r\n proxyGeometry.add(torusWrapper);\r\n proxyGeometry.add(cylinderMesh);\r\n\r\n scene.add(proxyGeometry.group);\r\n\r\n controls.target.set(0,1.5,0);\r\n\r\n camera.position.set(3, 3.5, 13);\r\n camera.lookAt(new THREE.Vector3(0,0,0));\r\n \r\n var rayMarcher = new RayMarcher(renderer, scene, camera);\r\n\r\n (function tick() {\r\n var deltaTime = Engine.clock.getDelta();\r\n\r\n Engine.time += deltaTime;\r\n Engine.cameraTime += deltaTime;\r\n Engine.deltaTime = deltaTime;\r\n\r\n controls.update();\r\n stats.begin();\r\n proxyGeometry.update();\r\n\r\n if (options.strategy === 'Proxy Geometry') {\r\n renderer.render(scene, camera);\r\n } else if (options.strategy === 'Ray Marching') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time);\r\n } else if (options.strategy === 'Banana') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time);\r\n }\r\n stats.end();\r\n requestAnimationFrame(tick);\r\n })();\r\n});\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 1\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 2\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 3\n// module chunks = 0","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 4\n// module chunks = 0","const THREE = require('three');\r\n\r\nexport var ProxyMaterial = new THREE.MeshLambertMaterial({\r\n color: 0xff0000\r\n});\r\n\r\nexport const PROXY_BUFFER_SIZE = 4;\r\n\r\nexport default class ProxyGeometry {\r\n constructor(bounds) {\r\n this.group = new THREE.Group();\r\n this._buffer = new Float32Array();\r\n this._transforms = new Float32Array();\r\n }\r\n\r\n add(mesh) {\r\n this.group.add(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n remove(mesh) {\r\n this.group.remove(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n update(t = 1/60) {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n\r\n // TODO: animate objects\r\n }\r\n this.computeBuffer();\r\n }\r\n\r\n computeBuffer() {\r\n const {children} = this.group;\r\n\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n this._buffer[PROXY_BUFFER_SIZE*i] = child.position.x;\r\n this._buffer[PROXY_BUFFER_SIZE*i+1] = child.position.y;\r\n this._buffer[PROXY_BUFFER_SIZE*i+2] = child.position.z;\r\n\r\n var worldToLocal = new THREE.Matrix4();\r\n worldToLocal.getInverse(child.matrixWorld);\r\n worldToLocal.toArray(this._transforms, i * 16);\r\n\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = child.userData.geoType;\r\n // if (child.geometry instanceof THREE.BoxGeometry) {\r\n // } else if (child.geometry instanceof THREE.SphereGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 1;\r\n // } else if (child.geometry instanceof THREE.ConeGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 2;\r\n // } else if (child.geometry instanceof THREE.PlaneGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 3;\r\n // } else if (child.geometry instanceof THREE.TorusGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 4;\r\n // } else if (child.geometry instanceof THREE.CylinderGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 5;\r\n // }\r\n }\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n\r\n get transforms()\r\n {\r\n return this._transforms;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/proxy_geometry.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tEventDispatcher.prototype = {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tvar REVISION = '84';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tvar textureId = 0;\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\t\tthis.x = ( m32 - m23 ) / s;\n\t\t\tthis.y = ( m13 - m31 ) / s;\n\t\t\tthis.z = ( m21 - m12 ) / s;\n\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\t\t\tthis.w = attribute.getW( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tWebGLRenderTarget.prototype = {\n\n\t\tconstructor: WebGLRenderTarget,\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\t\t\tvar w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ];\n\n\t\t\treturn this.divideScalar( w );\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCylindrical: function( c ) {\n\n\t\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\t\tthis.y = c.y;\n\t\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeShear: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, y, z, 0,\n\t\t\t\tx, 1, z, 0,\n\t\t\t\tx, y, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tif ( far === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"float 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}\\nvec2 ltcTextureCoords( const in GeometricContext geometry, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = (LUT_SIZE - 1.0)/LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5/LUT_SIZE;\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\\n\\tint config = 0;\\n\\tif ( L[0].z > 0.0 ) config += 1;\\n\\tif ( L[1].z > 0.0 ) config += 2;\\n\\tif ( L[2].z > 0.0 ) config += 4;\\n\\tif ( L[3].z > 0.0 ) config += 8;\\n\\tn = 0;\\n\\tif ( config == 0 ) {\\n\\t} else if ( config == 1 ) {\\n\\t\\tn = 3;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 2 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 3 ) {\\n\\t\\tn = 4;\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t\\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 4 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t} else if ( config == 5 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 6 ) {\\n\\t\\tn = 4;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 7 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 8 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = L[3];\\n\\t} else if ( config == 9 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t} else if ( config == 10 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 11 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 12 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t} else if ( config == 13 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = L[2];\\n\\t\\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t} else if ( config == 14 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t} else if ( config == 15 ) {\\n\\t\\tn = 4;\\n\\t}\\n\\tif ( n == 3 )\\n\\t\\tL[3] = L[0];\\n\\tif ( n == 4 )\\n\\t\\tL[4] = L[0];\\n}\\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\\n\\tfloat cosTheta = dot( v1, v2 );\\n\\tfloat theta = acos( cosTheta );\\n\\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\\n\\treturn res;\\n}\\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\\n\\trectPoints[0] = pos - halfWidth - halfHeight;\\n\\trectPoints[1] = pos + halfWidth - halfHeight;\\n\\trectPoints[2] = pos + halfWidth + halfHeight;\\n\\trectPoints[3] = pos - halfWidth + halfHeight;\\n}\\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tvec3 T1, T2;\\n\\tT1 = normalize(V - N * dot( V, N ));\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\\n\\tvec3 clippedRect[5];\\n\\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\\n\\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\\n\\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\\n\\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\\n\\tint n;\\n\\tclipQuadToHorizon(clippedRect, n);\\n\\tif ( n == 0 )\\n\\t\\treturn vec3( 0, 0, 0 );\\n\\tclippedRect[0] = normalize( clippedRect[0] );\\n\\tclippedRect[1] = normalize( clippedRect[1] );\\n\\tclippedRect[2] = normalize( clippedRect[2] );\\n\\tclippedRect[3] = normalize( clippedRect[3] );\\n\\tclippedRect[4] = normalize( clippedRect[4] );\\n\\tfloat sum = 0.0;\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\\n\\tif (n >= 4)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\\n\\tif (n == 5)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\\n\\tsum = max( 0.0, sum );\\n\\tvec3 Lo_i = vec3( sum, sum, sum );\\n\\treturn Lo_i;\\n}\\nvec3 Rect_Area_Light_Specular_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\\n\\t\\tconst in float roughness,\\n\\t\\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tvec2 uv = ltcTextureCoords( geometry, roughness );\\n\\tvec4 brdfLtcApproxParams, t;\\n\\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\\n\\tt = texture2D( ltcMat, uv );\\n\\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\\n\\tmat3 brdfLtcApproxMat = mat3(\\n\\t\\tvec3( 1, 0, t.y ),\\n\\t\\tvec3( 0, t.z, 0 ),\\n\\t\\tvec3( t.w, 0, t.x )\\n\\t);\\n\\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\\n\\tspecularReflectance *= brdfLtcScalar;\\n\\treturn specularReflectance;\\n}\\nvec3 Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tmat3 diffuseBrdfMat = mat3(1);\\n\\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\\n\\treturn diffuseReflectance;\\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\";\n\n\tvar 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\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, 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#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\n\tvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\n\tvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar 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};\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\\n\\t}\\n#endif\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff;\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar 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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#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\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar 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 ) * flipNormal;\\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\";\n\n\tvar 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\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar 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\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\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}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\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\\t#include \\n}\\n\";\n\n\tvar 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 \\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\\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\";\n\n\tvar 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 \\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\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\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\\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\";\n\n\tvar 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 \\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\";\n\n\tvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\n\tvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\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\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\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#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\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_vertex: fog_vertex,\n\t\tfog_pars_vertex: fog_pars_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\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 ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tgradientmap: {\n\n\t\t\tgradientMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} },\n\n\t\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\t\trectAreaLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\twidth: {},\n\t\t\t\theight: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.gradientmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tscale: { value: 1 },\n\t\t\t\t\tdashSize: { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\t\t\t\tlightPos: { value: new Vector3() }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tShaderLib.standard.uniforms,\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyMatrix4( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( fog.isFog ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar materialId = 0;\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tvar x = attribute.getX( i );\n\t\t\t\tvar y = attribute.getY( i );\n\t\t\t\tvar z = attribute.getZ( i );\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\treturn this.expandByObject( object );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function expandByObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box;\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tif ( box === undefined ) box = new Box3(); // see #10547\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( light && light.isPointLight ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\t// TODO (abelnation / sam-g-steel): is this needed?\n\t\t\t\tif (shadow && shadow.isRectAreaLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material && material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tvar object3DId = 0;\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\n\t\tthis.onBeforeRender = function () {};\n\t\tthis.onAfterRender = function () {};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject3D.prototype = {\n\n\t\tconstructor: Object3D,\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.layers.mask = source.layers.mask;\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\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\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int8Array( array ), itemSize );\n\n\t}\n\n\tInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\n\tfunction Uint8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8Array( array ), itemSize );\n\n\t}\n\n\tUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\n\tfunction Uint8ClampedBufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\n\tfunction Int16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int16Array( array ), itemSize );\n\n\t}\n\n\tInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\n\tfunction Uint16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint16Array( array ), itemSize );\n\n\t}\n\n\tUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\n\tfunction Int32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int32Array( array ), itemSize );\n\n\t}\n\n\tInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\n\tfunction Uint32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint32Array( array ), itemSize );\n\n\t}\n\n\tUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\n\tfunction Float32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float32Array( array ), itemSize );\n\n\t}\n\n\tFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\n\tfunction Float64BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float64Array( array ), itemSize );\n\n\t}\n\n\tFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, {\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex = undefined;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t// http://stackoverflow.com/questions/1669190/javascript-min-max-array-values/13440842#13440842\n\n\tfunction arrayMax( array ) {\n\n\t\tvar length = array.length, max = - Infinity;\n\n\t\twhile ( length -- ) {\n\n\t\t\tif ( array[ length ] > max ) {\n\n\t\t\t\tmax = array[ length ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn max;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tvar count = 0;\n\tfunction GeometryIdCount() { return count++; }\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tGeometry.prototype = {\n\n\t\tconstructor: Geometry,\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( ( geometry && geometry.isGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( ( mesh && mesh.isMesh ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar i, il, j, jl, k, kl;\n\n\t\t\t// reset\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.colors = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [[]];\n\t\t\tthis.morphTargets = [];\n\t\t\tthis.morphNormals = [];\n\t\t\tthis.skinWeights = [];\n\t\t\tthis.skinIndices = [];\n\t\t\tthis.lineDistances = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// vertices\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// face vertex uvs\n\n\t\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargets = source.morphTargets;\n\n\t\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = {};\n\t\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t\t// vertices\n\n\t\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// normals\n\n\t\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t\t// morph normals\n\n\t\t\tvar morphNormals = source.morphNormals;\n\n\t\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphNormal = {};\n\n\t\t\t\t// vertex normals\n\n\t\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// face normals\n\n\t\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t\t}\n\n\t\t\t// skin weights\n\n\t\t\tvar skinWeights = source.skinWeights;\n\n\t\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// skin indices\n\n\t\t\tvar skinIndices = source.skinIndices;\n\n\t\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// line distances\n\n\t\t\tvar lineDistances = source.lineDistances;\n\n\t\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// update flags\n\n\t\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tBufferGeometry.prototype = {\n\n\t\tconstructor: BufferGeometry,\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tif ( Array.isArray( index ) ) {\n\n\t\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tthis.index = index;\n\n\t\t\t}\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh ) {\n\n\t\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar position = this.attributes.position;\n\n\t\t\t\tif ( position ) {\n\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( ( geometry && geometry.isBufferGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// index\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tvar morphAttributes = source.morphAttributes;\n\n\t\t\tfor ( name in morphAttributes ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// draw range\n\n\t\t\tthis.drawRange.start = source.drawRange.start;\n\t\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uv ) {\n\n\t\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar intersection;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = ( material && material.isMultiMaterial );\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar uvs;\n\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar numberOfVertices = 0;\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth = width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar ix, iy;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar ix, iy;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else if ( index.array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\t\t\t\tsize = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t \n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\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 );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshToonMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( map.isTexture ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tvar type = gl.FLOAT;\n\t\t\tvar array = data.array;\n\n\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\ttype = gl.FLOAT;\n\n\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\ttype = gl.SHORT;\n\n\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\ttype = gl.INT;\n\n\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\ttype = gl.BYTE;\n\n\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t\t}\n\n\t\t\tattributeProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\t\tattributeProperties.type = type;\n\t\t\tattributeProperties.version = data.version;\n\n\t\t\tdata.onUploadCallback();\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\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.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getAttributeProperties( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data );\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute );\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetAttributeProperties: getAttributeProperties,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\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 );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar version = parseFloat( /^WebGL\\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );\n\t\tvar lineWidthAvailable = parseFloat( version ) >= 1.0;\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\t\t\tdepthBuffer.setClear( 1 );\n\t\t\tstencilBuffer.setClear( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t\t// internal state cache\n\n\t\t\t_currentProgram = null,\n\t\t\t_currentRenderTarget = null,\n\t\t\t_currentFramebuffer = null,\n\t\t\t_currentMaterialId = - 1,\n\t\t\t_currentGeometryProgram = '',\n\t\t\t_currentCamera = null,\n\n\t\t\t_currentScissor = new Vector4(),\n\t\t\t_currentScissorTest = null,\n\n\t\t\t_currentViewport = new Vector4(),\n\n\t\t\t//\n\n\t\t\t_usedTextureUnits = 0,\n\n\t\t\t//\n\n\t\t\t_clearColor = new Color( 0x000000 ),\n\t\t\t_clearAlpha = 0,\n\n\t\t\t_width = _canvas.width,\n\t\t\t_height = _canvas.height,\n\n\t\t\t_pixelRatio = 1,\n\n\t\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissorTest = false,\n\n\t\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t\t// frustum\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t// clipping\n\n\t\t\t_clipping = new WebGLClipping(),\n\t\t\t_clippingEnabled = false,\n\t\t\t_localClippingEnabled = false,\n\n\t\t\t_sphere = new Sphere(),\n\n\t\t\t// camera matrices cache\n\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_vector3 = new Vector3(),\n\t\t\t_matrix4 = new Matrix4(),\n\t\t\t_matrix42 = new Matrix4(),\n\n\t\t\t// light arrays cache\n\n\t\t\t_lights = {\n\n\t\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\trectArea: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\t\tshadows: []\n\n\t\t\t},\n\n\t\t\t// info\n\n\t\t\t_infoRender = {\n\n\t\t\t\tcalls: 0,\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0,\n\t\t\t\tpoints: 0\n\n\t\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundPlaneCamera, backgroundPlaneMesh;\n\t\tvar backgroundBoxCamera, backgroundBoxMesh;\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\t\tmaterial.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\t\tvar attributeProperties = objects.getAttributeProperties( geometryAttribute );\n\n\t\t\t\t\t\tvar buffer = attributeProperties.__webglBuffer;\n\t\t\t\t\t\tvar type = attributeProperties.type;\n\t\t\t\t\t\tvar bytesPerElement = attributeProperties.bytesPerElement;\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tstate.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tif ( backgroundBoxCamera === undefined ) {\n\n\t\t\t\t\tbackgroundBoxCamera = new PerspectiveCamera();\n\n\t\t\t\t\tbackgroundBoxMesh = new Mesh(\n\t\t\t\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\t\tfog: false\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );\n\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tif ( backgroundPlaneCamera === undefined ) {\n\n\t\t\t\t\tbackgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\t\tbackgroundPlaneMesh = new Mesh(\n\t\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t\t! material.isRawShaderMaterial ||\n\t\t\t\tmaterial.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.rectAreaLights.value = _lights.rectArea;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isMeshNormalMaterial ||\n\t\t\t\t\tmaterial.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// RectAreaLight Texture\n\t\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\t\tif ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE;\n\t\t\t\tif ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE;\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t\tif ( material.gradientMap ) {\n\n\t\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\t\tr = 0, g = 0, b = 0,\n\t\t\t\tcolor,\n\t\t\t\tintensity,\n\t\t\t\tdistance,\n\t\t\t\tshadowMap,\n\n\t\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\trectAreaLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\t// (a) intensity controls irradiance of entire light\n\t\t\t\t\tuniforms.color\n\t\t\t\t\t\t.copy( color )\n\t\t\t\t\t\t.multiplyScalar( intensity / ( light.width * light.height ) );\n\n\t\t\t\t\t// (b) intensity controls the radiance per light area\n\t\t\t\t\t// uniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\t\t_matrix42.identity();\n\t\t\t\t\t_matrix4.copy( light.matrixWorld );\n\t\t\t\t\t_matrix4.premultiply( viewMatrix );\n\t\t\t\t\t_matrix42.extractRotation( _matrix4 );\n\n\t\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\t\tuniforms.halfWidth.applyMatrix4( _matrix42 );\n\t\t\t\t\tuniforms.halfHeight.applyMatrix4( _matrix42 );\n\n\t\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\t\t_lights.rectArea[ rectAreaLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.rectArea.length = rectAreaLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t// TODO (sam-g-steel) why aren't we using join\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar i, j, l, o, ol;\n\t\tvar edge = [ 0, 0 ], edges = {}, e;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\t\tvar vertex;\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tvar position, indices, groups;\n\t\t\tvar group, start, count;\n\t\t\tvar index1, index2;\n\n\t\t\tvertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\t\t\t\tindices = geometry.index;\n\t\t\t\tgroups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.count );\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\t\tstart = group.start;\n\t\t\t\t\tcount = group.count;\n\n\t\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices.getX( i + j );\n\t\t\t\t\t\t\tedge[ 1 ] = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( key in edges ) {\n\n\t\t\t\t\te = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\n\t\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tvar v = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tvar u = j / slices;\n\n\t\t\t\tvar p = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\tvar a = i * sliceCount + j;\n\t\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tvar azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\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\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\t r, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, j;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\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.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // curve to extrude shape along\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( ( font && font.isFont ) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar ix, iy;\n\n\t\tvar index = 0;\n\t\tvar grid = [];\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = iy / heightSegments;\n\n\t\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tvar u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// some helper variables\n\n\t\tvar segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t */\n\n\tfunction ShapeGeometry( shapes, curveSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tcurveSegments = curveSegments || 12;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar groupStart = 0;\n\t\tvar groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tvar i, l, shapeHole;\n\n\t\t\tvar indexOffset = vertices.length / 3;\n\t\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\t\tvar shapeVertices = points.shape;\n\t\t\tvar shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t\t// also check if holes are in the opposite direction\n\n\t\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\t\tvar edge = [ 0, 0 ], edges = {};\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t\t// prepare source geometry\n\n\t\tvar geometry2;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar sourceVertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tkey = edge.toString();\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\tvar e = edges[ key ];\n\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar index = 0;\n\t\tvar indexOffset = 0;\n\t\tvar indexArray = [];\n\t\tvar halfHeight = height / 2;\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\n\t\t\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, s;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tShapeBufferGeometry: ShapeBufferGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tBoxGeometry: BoxGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = Array.isArray( materials ) ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author takahirox / http://github.com/takahirox\n\t *\n\t * parameters = {\n\t * gradientMap: new THREE.Texture( )\n\t * }\n\t */\n\n\tfunction MeshToonMaterial( parameters ) {\n\n\t\tMeshPhongMaterial.call( this );\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.gradientMap = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\n\tMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\n\tMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\n\tMeshToonMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshToonMaterial: MeshToonMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FileLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FileLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { type: mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMimeType: function ( value ) {\n\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tfunction DataTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( DataTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\t\timage.addEventListener( 'load', function () {\n\n\t\t\t\tCache.add( url, this );\n\n\t\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\t/*\n\t\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t\t}, false );\n\t\t\t*/\n\n\t\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\timage.src = url;\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function ( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function () {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function () {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function ( timeOffset ) {\n\n\t\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function ( timeScale ) {\n\n\t\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function ( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== - 1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function () {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif ( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function () {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0; m !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar BlendingMode = {\n\t\t\t\tNoBlending: NoBlending,\n\t\t\t\tNormalBlending: NormalBlending,\n\t\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\t\tCustomBlending: CustomBlending\n\t\t\t};\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\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.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = null;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tscope.parse( json, onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tvar TextureMapping = {\n\t\t\t\tUVMapping: UVMapping,\n\t\t\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\t\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\t\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\t\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\t\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\t\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\t\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t\t\t};\n\n\t\t\tvar TextureWrapping = {\n\t\t\t\tRepeatWrapping: RepeatWrapping,\n\t\t\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\t\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t\t\t};\n\n\t\t\tvar TextureFilter = {\n\t\t\t\tNearestFilter: NearestFilter,\n\t\t\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\t\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\t\t\tLinearFilter: LinearFilter,\n\t\t\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\t\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t\t\t};\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.' );\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Bezier Curves formulas obtained from\n\t * http://en.wikipedia.org/wiki/Bézier_curve\n\t */\n\n\tfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\tvar t2 = t * t;\n\t\tvar t3 = t * t2;\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t}\n\n\t//\n\n\tfunction QuadraticBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * p;\n\n\t}\n\n\tfunction QuadraticBezierP1( t, p ) {\n\n\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t}\n\n\tfunction QuadraticBezierP2( t, p ) {\n\n\t\treturn t * t * p;\n\n\t}\n\n\tfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\t\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\t\tQuadraticBezierP2( t, p2 );\n\n\t}\n\n\t//\n\n\tfunction CubicBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * k * p;\n\n\t}\n\n\tfunction CubicBezierP1( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn 3 * k * k * t * p;\n\n\t}\n\n\tfunction CubicBezierP2( t, p ) {\n\n\t\treturn 3 * ( 1 - t ) * t * t * p;\n\n\t}\n\n\tfunction CubicBezierP3( t, p ) {\n\n\t\treturn t * t * t * p;\n\n\t}\n\n\tfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\t\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\t\tCubicBezierP3( t, p3 );\n\n\t}\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.CatmullRomCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\n\n\t\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function ( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\treturn new Vector2(\n\t\t\tCatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),\n\t\t\tCatmullRom( weight, point0.y, point1.y, point2.y, point3.y )\n\t\t);\n\n\t};\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector2(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector2(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\t **/\n\n\tfunction ShapePath() {\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tShapePath.prototype = {\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push( this.currentPath );\n\t\t\tthis.currentPath.moveTo( x, y );\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tthis.currentPath.lineTo( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts ) {\n\n\t\t\tthis.currentPath.splineThru( pts );\n\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\t\toffsetX = 0;\n\t\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [];\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tvar AudioContext = {\n\n\t\tgetContext: function () {\n\n\t\t\tif ( context === undefined ) {\n\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t\t}\n\n\t\t\treturn context;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = AudioContext.getContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction RectAreaLight ( color, intensity, width, height ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.position.set( 0, 1, 0 );\n\t\tthis.updateMatrix();\n\n\t\tthis.width = ( width !== undefined ) ? width : 10;\n\t\tthis.height = ( height !== undefined ) ? height : 10;\n\n\t\t// TODO (abelnation): distance/decay\n\n\t\t// TODO (abelnation): update method for RectAreaLight to update transform to lookat target\n\n\t\t// TODO (abelnation): shadows\n\t\t// this.shadow = new THREE.RectAreaLightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\t// TODO (abelnation): RectAreaLight update when light shape is changed\n\tRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: RectAreaLight,\n\n\t\tisRectAreaLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\t// this.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.loop = false;\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.buffer;\n\t\t\tsource.loop = this.loop;\n\t\t\tsource.onended = this.onEnded.bind( this );\n\t\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\t\tsource.start( 0, this.startTime );\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.loop = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.loop = this.loop;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tbufferType = Array;\n\t\t\t\tmixFunction = this._select;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:[\\w-]+[\\/:])*)([\\w-]+)?(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?\\.([\\w-]+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ],\n\t\t\t\t\tknownObject = undefined;\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis._loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tAnimationMixer.prototype = {\n\n\t\tconstructor: AnimationMixer,\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function () {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function ( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function () {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function ( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function ( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function ( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function ( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function ( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function () {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function ( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function ( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function () {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tUniform.prototype.clone = function () {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n\t *\n\t */\n\n\tfunction Cylindrical( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tCylindrical.prototype = {\n\n\t\tconstructor: Cylindrical,\n\n\t\tset: function ( radius, theta, y ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.theta = theta;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.theta = other.theta;\n\t\t\tthis.y = other.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\t\tthis.y = vec3.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = 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} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar color1 = new Color( 0, 0, 1 );\n\t\tvar color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( object && object.isBone ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar boneMatrix = new Matrix4();\n\t\tvar matrixWorldInv = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\t\tfor ( var i = 0, j = 0; i < this.bones.length; i ++ ) {\n\n\t\t\t\tvar bone = this.bones[ i ];\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tj += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t * @author Mugen87 / http://github.com/Mugen87\n\t */\n\n\tfunction RectAreaLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar materialFront = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false\n\t\t} );\n\n\t\tvar materialBack = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false,\n\t\t\twireframe: true\n\t\t} );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 6 * 3 ), 3 ) );\n\n\t\t// shows the \"front\" of the light, e.g. where light comes from\n\n\t\tthis.add( new Mesh( geometry, materialFront ) );\n\n\t\t// shows the \"back\" of the light, which does not emit light\n\n\t\tthis.add( new Mesh( geometry, materialBack ) );\n\n\t\tthis.update();\n\n\t}\n\n\tRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\n\tRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\n\tRectAreaLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\t\tthis.children[ 1 ].geometry.dispose();\n\t\tthis.children[ 1 ].material.dispose();\n\n\t};\n\n\tRectAreaLightHelper.prototype.update = function () {\n\n\t\tvar vector1 = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh1 = this.children[ 0 ];\n\t\t\tvar mesh2 = this.children[ 1 ];\n\n\t\t\tif ( this.light.target ) {\n\n\t\t\t\tvector1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\t\tvar lookVec = vector2.clone().sub( vector1 );\n\t\t\t\tmesh1.lookAt( lookVec );\n\t\t\t\tmesh2.lookAt( lookVec );\n\n\t\t\t}\n\n\t\t\t// update materials\n\n\t\t\tmesh1.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tmesh2.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// calculate new dimensions of the helper\n\n\t\t\tvar hx = this.light.width * 0.5;\n\t\t\tvar hy = this.light.height * 0.5;\n\n\t\t\t// because the buffer attribute is shared over both geometries, we only have to update once\n\n\t\t\tvar position = mesh1.geometry.getAttribute( 'position' );\n\t\t\tvar array = position.array;\n\n\t\t\t// first face\n\n\t\t\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\t\t\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\t\t\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\n\t\t\t// second face\n\n\t\t\tarray[ 9 ] = - hx; array[ 10 ] = hy; array[ 11 ] = 0;\n\t\t\tarray[ 12 ] = - hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\t\t\tarray[ 15 ] = hx; array[ 16 ] = - hy; array[ 17 ] = 0;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction HemisphereLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } );\n\n\t\tvar position = geometry.getAttribute( 'position' );\n\t\tvar colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar color1 = new Color();\n\t\tvar color2 = new Color();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh = this.children[ 0 ];\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tcolor2.copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tsize = size || 10;\n\t\tdivisions = divisions || 10;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = size / divisions;\n\t\tvar halfSize = size / 2;\n\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author Hectate / http://www.github.com/Hectate\n\t */\n\n\tfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\t\tradius = radius || 10;\n\t\tradials = radials || 16;\n\t\tcircles = circles || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar x, z;\n\t\tvar v, i, j, r, color;\n\n\t\t// create the radials\n\n\t\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * radius;\n\t\t\tz = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tr = radius - ( radius / circles * i );\n\n\t\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tPolarGridHelper.prototype = Object.create( LineSegments.prototype );\n\tPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new BufferGeometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar colorFrustum = new Color( 0xffaa00 );\n\t\tvar colorCone = new Color( 0xff0000 );\n\t\tvar colorUp = new Color( 0x00aaff );\n\t\tvar colorTarget = new Color( 0xffffff );\n\t\tvar colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", colorFrustum );\n\t\taddLine( \"n2\", \"n4\", colorFrustum );\n\t\taddLine( \"n4\", \"n3\", colorFrustum );\n\t\taddLine( \"n3\", \"n1\", colorFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", colorFrustum );\n\t\taddLine( \"f2\", \"f4\", colorFrustum );\n\t\taddLine( \"f4\", \"f3\", colorFrustum );\n\t\taddLine( \"f3\", \"f1\", colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", colorFrustum );\n\t\taddLine( \"n2\", \"f2\", colorFrustum );\n\t\taddLine( \"n3\", \"f3\", colorFrustum );\n\t\taddLine( \"n4\", \"f4\", colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", colorCone );\n\t\taddLine( \"p\", \"n2\", colorCone );\n\t\taddLine( \"p\", \"n3\", colorCone );\n\t\taddLine( \"p\", \"n4\", colorCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", colorUp );\n\t\taddLine( \"u2\", \"u3\", colorUp );\n\t\taddLine( \"u3\", \"u1\", colorUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", colorTarget );\n\t\taddLine( \"p\", \"c\", colorCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", colorCross );\n\t\taddLine( \"cn3\", \"cn4\", colorCross );\n\n\t\taddLine( \"cf1\", \"cf2\", colorCross );\n\t\taddLine( \"cf3\", \"cf4\", colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\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 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( object && object.isBox3 ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry;\n\tvar coneGeometry;\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( lineGeometry === undefined ) {\n\n\t\t\tlineGeometry = new BufferGeometry();\n\t\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t];\n\n\t\tvar colors = [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\n\t/*\n\tBased on an optimized c++ solution in\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t - http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tfunction CubicPoly() {\n\n\t\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tfunction init( x0, x1, t0, t1 ) {\n\n\t\t\tc0 = x0;\n\t\t\tc1 = t0;\n\t\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t\t},\n\n\t\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\t\tt1 *= dt1;\n\t\t\t\tt2 *= dt1;\n\n\t\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t\t},\n\n\t\t\tcalc: function ( t ) {\n\n\t\t\t\tvar t2 = t * t;\n\t\t\t\tvar t3 = t2 * t;\n\t\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar tmp = new Vector3();\n\tvar px = new CubicPoly();\n\tvar py = new CubicPoly();\n\tvar pz = new CubicPoly();\n\n\tfunction CatmullRomCurve3( p /* array of Vector3 */ ) {\n\n\t\tthis.points = p || [];\n\t\tthis.closed = false;\n\n\t}\n\n\tCatmullRomCurve3.prototype = Object.create( Curve.prototype );\n\tCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\n\tCatmullRomCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar l = points.length;\n\n\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\tvar point = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tp1 = points[ intPoint % l ];\n\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t}\n\n\t\treturn new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );\n\n\t};\n\n\tfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve3.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\n\tCubicBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector3(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\n\tQuadraticBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector3(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t};\n\n\tfunction LineCurve3( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve3.prototype = Object.create( Curve.prototype );\n\tLineCurve3.prototype.constructor = LineCurve3;\n\n\tLineCurve3.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar vector = new Vector3();\n\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\tvector.multiplyScalar( t );\n\t\tvector.add( this.v1 );\n\n\t\treturn vector;\n\n\t};\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction MeshFaceMaterial( materials ) {\n\n\t\tconsole.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' );\n\t\treturn new MultiMaterial( materials );\n\n\t}\n\n\tfunction PointCloud( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction Particle( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\treturn new Sprite( material );\n\n\t}\n\n\tfunction ParticleSystem( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction PointCloudMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleBasicMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleSystemMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction Vertex( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\n\t}\n\n\t//\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\treturn new Int8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\treturn new Uint8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\treturn new Int16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\treturn new Uint16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\treturn new Int32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\treturn new Uint32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\treturn new Float64BufferAttribute( array, itemSize );\n\n\t}\n\n\t//\n\n\tCurve.create = function ( construct, getPoint ) {\n\n\t\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\t\tconstruct.prototype = Object.create( Curve.prototype );\n\t\tconstruct.prototype.constructor = construct;\n\t\tconstruct.prototype.getPoint = getPoint;\n\n\t\treturn construct;\n\n\t};\n\n\t//\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction SplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction Spline( points ) {\n\n\t\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\tObject.assign( Spline.prototype, {\n\n\t\tinitFromArray: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t\t},\n\t\tgetControlPointsArray: function ( optionalTarget ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t\t},\n\t\treparametrizeByArcLength: function ( samplingCoef ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\t//\n\tfunction BoundingBoxHelper( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\treturn new BoxHelper( object, color );\n\n\t}\n\n\tfunction EdgesHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\tfunction WireframeHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\t//\n\n\tfunction XHRLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\treturn new FileLoader( manager );\n\n\t}\n\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\treturn new DataTextureLoader( manager );\n\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tLine3.prototype.center = function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t};\n\n\t_Math.random16 = function () {\n\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t};\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\textractPosition: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\n\t\t},\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\trotateAxis: function ( v ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\ttranslate: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t\t},\n\t\trotateX: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t\t},\n\t\trotateY: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t\t},\n\t\trotateZ: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t\t},\n\t\trotateByAxis: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t\t},\n\t\tmakeFrustum: function( left, right, bottom, top, near, far ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t\t}\n\n\t} );\n\n\tPlane.prototype.isIntersectionLine = function ( line ) {\n\n\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\treturn this.intersectsLine( line );\n\n\t};\n\n\tQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t};\n\n\tObject.assign( Ray.prototype, {\n\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\n\t\textrude: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tsetEulerFromRotationMatrix: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t\t},\n\t\tapplyProjection: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\t\treturn this.applyMatrix4( m );\n\n\t\t},\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tGeometry.prototype.computeTangents = function () {\n\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t};\n\n\tObject.assign( Object3D.prototype, {\n\n\t\tgetChildByName: function ( name ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\n\t\t},\n\t\trenderDepth: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\n\t\teulerOrder: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\n\t\tobjects: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\n\t\tlength: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\t\treturn this.array.length;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\n\t\taddIndex: function ( index ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\t\tif ( indexOffset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\n\t\t},\n\t\tclearDrawCalls: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\n\t\t},\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t\t},\n\t\tcomputeOffsets: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\n\t\tdynamic: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\n\t\twrapAround: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\t\tmetal: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\n\t\tderivatives: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\n\t\tsupportsFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\t\treturn this.capabilities.vertexTextures;\n\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\n\t\t},\n\t\tinitMaterial: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t\t},\n\t\taddPrePlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t\t},\n\t\taddPostPlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t\t},\n\t\tupdateShadowMap: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.enabled;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.cullFace;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\n\t\tcullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\t\twrapS: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tAudio.prototype.load = function ( file ) {\n\n\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\tvar scope = this;\n\t\tvar audioLoader = new AudioLoader();\n\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\tscope.setBuffer( buffer );\n\n\t\t} );\n\t\treturn this;\n\n\t};\n\n\tAudioAnalyser.prototype.getData = function () {\n\n\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\treturn this.getFrequencyData();\n\n\t};\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector() {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function () {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer() {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.Texture = Texture;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.FileLoader = FileLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.RectAreaLight = RectAreaLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.AudioContext = AudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Cylindrical = Cylindrical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.RectAreaLightHelper = RectAreaLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.PolarGridHelper = PolarGridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.Path = Path;\n\texports.ShapePath = ShapePath;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ShapeBufferGeometry = ShapeBufferGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshToonMaterial = MeshToonMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.Float64BufferAttribute = Float64BufferAttribute;\n\texports.Float32BufferAttribute = Float32BufferAttribute;\n\texports.Uint32BufferAttribute = Uint32BufferAttribute;\n\texports.Int32BufferAttribute = Int32BufferAttribute;\n\texports.Uint16BufferAttribute = Uint16BufferAttribute;\n\texports.Int16BufferAttribute = Int16BufferAttribute;\n\texports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\n\texports.Uint8BufferAttribute = Uint8BufferAttribute;\n\texports.Int8BufferAttribute = Int8BufferAttribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MeshFaceMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Particle;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.Spline = Spline;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.XHRLoader = XHRLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 6\n// module chunks = 0","const THREE = require('three');\r\nconst EffectComposer = require('three-effectcomposer')(THREE)\r\n\r\nimport {PROXY_BUFFER_SIZE} from './proxy_geometry'\r\n\r\nexport default function RayMarcher(renderer, scene, camera) {\r\n\r\n var minionComposer = new EffectComposer(renderer);\r\n var minionPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n gradientMap: { type: \"t\", value: null},\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/minion.frag.glsl')\r\n });\r\n minionPass.renderToScreen = true;\r\n minionComposer.addPass(minionPass);\r\n\r\n var composer = new EffectComposer(renderer);\r\n var shaderPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/rayMarch-frag.glsl')\r\n });\r\n shaderPass.renderToScreen = true;\r\n\r\n var txLoader = new THREE.TextureLoader();\r\n txLoader.load('./images/gradients.png', function(texture) {\r\n minionPass.material.uniforms.gradientMap.value = texture;\r\n });\r\n\r\n // Adding this composer we force updating the scene transformations\r\n composer.addPass(new EffectComposer.RenderPass(scene, camera));\r\n composer.addPass(shaderPass);\r\n\r\n var inverseProjectionMatrix = new THREE.Matrix4();\r\n\r\n return {\r\n render: function(buffer, transforms, camera, options, minionScene, time) \r\n {\r\n\r\n camera.updateMatrix();\r\n camera.updateProjectionMatrix();\r\n inverseProjectionMatrix.getInverse(camera.projectionMatrix);\r\n\r\n if(minionScene)\r\n {\r\n minionPass.material.uniforms.u_buffer.value = buffer;\r\n minionPass.material.uniforms.u_transforms.value = transforms;\r\n minionPass.material.uniforms.u_count.value = 0;\r\n minionPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n minionPass.material.uniforms.time.value = time;\r\n\r\n minionPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n minionPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n minionComposer.render();\r\n }\r\n else\r\n {\r\n shaderPass.material.uniforms.u_buffer.value = buffer;\r\n shaderPass.material.uniforms.u_transforms.value = transforms;\r\n shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE;\r\n shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n shaderPass.material.uniforms.time.value = time;\r\n\r\n shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n composer.render();\r\n } \r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/rayMarching.js","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n var CopyShader = EffectComposer.CopyShader = require('three-copyshader')\n , RenderPass = EffectComposer.RenderPass = require('./lib/renderpass')(THREE)\n , ShaderPass = EffectComposer.ShaderPass = require('./lib/shaderpass')(THREE, EffectComposer)\n , MaskPass = EffectComposer.MaskPass = require('./lib/maskpass')(THREE)\n , ClearMaskPass = EffectComposer.ClearMaskPass = require('./lib/clearmaskpass')(THREE)\n\n function EffectComposer( renderer, renderTarget ) {\n this.renderer = renderer;\n\n if ( renderTarget === undefined ) {\n var width = window.innerWidth || 1;\n var height = window.innerHeight || 1;\n var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\n renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n this.passes = [];\n\n this.copyPass = new ShaderPass( CopyShader );\n };\n\n EffectComposer.prototype = {\n swapBuffers: function() {\n\n var tmp = this.readBuffer;\n this.readBuffer = this.writeBuffer;\n this.writeBuffer = tmp;\n\n },\n\n addPass: function ( pass ) {\n\n this.passes.push( pass );\n\n },\n\n insertPass: function ( pass, index ) {\n\n this.passes.splice( index, 0, pass );\n\n },\n\n render: function ( delta ) {\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n var maskActive = false;\n\n var pass, i, il = this.passes.length;\n\n for ( i = 0; i < il; i ++ ) {\n\n pass = this.passes[ i ];\n\n if ( !pass.enabled ) continue;\n\n pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n if ( pass.needsSwap ) {\n\n if ( maskActive ) {\n\n var context = this.renderer.context;\n\n context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n }\n\n this.swapBuffers();\n\n }\n\n if ( pass instanceof MaskPass ) {\n\n maskActive = true;\n\n } else if ( pass instanceof ClearMaskPass ) {\n\n maskActive = false;\n\n }\n\n }\n\n },\n\n reset: function ( renderTarget ) {\n\n if ( renderTarget === undefined ) {\n\n renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = window.innerWidth;\n renderTarget.height = window.innerHeight;\n\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n },\n\n setSize: function ( width, height ) {\n\n var renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = width;\n renderTarget.height = height;\n\n this.reset( renderTarget );\n\n }\n\n };\n\n // shared ortho camera\n\n EffectComposer.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n EffectComposer.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\n EffectComposer.scene = new THREE.Scene();\n EffectComposer.scene.add( EffectComposer.quad );\n\n return EffectComposer\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/index.js\n// module id = 8\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nmodule.exports = {\n uniforms: {\n \"tDiffuse\": { type: \"t\", value: null },\n \"opacity\": { type: \"f\", value: 1.0 }\n },\n vertexShader: [\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vUv = uv;\",\n \"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n \"}\"\n ].join(\"\\n\"),\n fragmentShader: [\n \"uniform float opacity;\",\n\n \"uniform sampler2D tDiffuse;\",\n\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vec4 texel = texture2D( tDiffuse, vUv );\",\n \"gl_FragColor = opacity * texel;\",\n\n \"}\"\n ].join(\"\\n\")\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-copyshader/index.js\n// module id = 9\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function RenderPass( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n if (!(this instanceof RenderPass)) return new RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha);\n\n this.scene = scene;\n this.camera = camera;\n\n this.overrideMaterial = overrideMaterial;\n\n this.clearColor = clearColor;\n this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n this.oldClearColor = new THREE.Color();\n this.oldClearAlpha = 1;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n };\n\n RenderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n this.scene.overrideMaterial = this.overrideMaterial;\n\n if ( this.clearColor ) {\n\n this.oldClearColor.copy( renderer.getClearColor() );\n this.oldClearAlpha = renderer.getClearAlpha();\n\n renderer.setClearColor( this.clearColor, this.clearAlpha );\n\n }\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n if ( this.clearColor ) {\n\n renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n }\n\n this.scene.overrideMaterial = null;\n\n }\n\n };\n\n return RenderPass;\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/renderpass.js\n// module id = 10\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE, EffectComposer) {\n function ShaderPass( shader, textureID ) {\n if (!(this instanceof ShaderPass)) return new ShaderPass(shader, textureID);\n\n this.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n this.material = new THREE.ShaderMaterial( {\n\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader\n\n } );\n\n this.renderToScreen = false;\n\n this.enabled = true;\n this.needsSwap = true;\n this.clear = false;\n\n };\n\n ShaderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n if ( this.uniforms[ this.textureID ] ) {\n\n this.uniforms[ this.textureID ].value = readBuffer;\n\n }\n\n EffectComposer.quad.material = this.material;\n\n if ( this.renderToScreen ) {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera );\n\n } else {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera, writeBuffer, this.clear );\n\n }\n\n }\n\n };\n\n return ShaderPass;\n\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/shaderpass.js\n// module id = 11\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function MaskPass( scene, camera ) {\n if (!(this instanceof MaskPass)) return new MaskPass(scene, camera);\n\n this.scene = scene;\n this.camera = camera;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n this.inverse = false;\n };\n\n MaskPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n var context = renderer.context;\n\n // don't update color or depth\n\n context.colorMask( false, false, false, false );\n context.depthMask( false );\n\n // set up stencil\n\n var writeValue, clearValue;\n\n if ( this.inverse ) {\n\n writeValue = 0;\n clearValue = 1;\n\n } else {\n\n writeValue = 1;\n clearValue = 0;\n\n }\n\n context.enable( context.STENCIL_TEST );\n context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n context.clearStencil( clearValue );\n\n // draw into the stencil buffer\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n renderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n // re-enable update of color and depth\n\n context.colorMask( true, true, true, true );\n context.depthMask( true );\n\n // only render where stencil is set to 1\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n context.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n }\n\n };\n\n return MaskPass\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/maskpass.js\n// module id = 12\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function ClearMaskPass() {\n if (!(this instanceof ClearMaskPass)) return new ClearMaskPass(scene, camera);\n this.enabled = true;\n };\n\n ClearMaskPass.prototype = {\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n var context = renderer.context;\n context.disable( context.STENCIL_TEST );\n }\n };\n\n return ClearMaskPass\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/clearmaskpass.js\n// module id = 13\n// module chunks = 0","module.exports = \"#define FAR_CLIP 1000.0\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayDir;\\r\\nvarying vec3 f_rayPos;\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nvoid main() {\\r\\n\\tvec2 tmp = vec2(uv.x, uv.y);\\r\\n tmp = (tmp * 2.0) - vec2(1.0);\\r\\n f_ndcP = vec4(tmp, 1.0, 1.0) * FAR_CLIP;\\r\\n f_uv = uv;\\r\\n\\r\\n f_rayDir = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - u_cameraPosition);\\r\\n f_rayPos = u_cameraPosition;\\r\\n\\r\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/pass-vert.glsl\n// module id = 14\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 32\\r\\n#define SECONDARY_ITERATIONS 2\\r\\n#define EPSILON 0.01\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .0075\\r\\n\\r\\n#define AO_ITERATIONS 4\\r\\n#define AO_DELTA .133\\r\\n#define AO_DECAY .8\\r\\n#define AO_INTENSITY .3\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 18\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .01\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nuniform sampler2D gradientMap;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: https://github.com/stackgl/glsl-smooth-min\\r\\nfloat smin(float a, float b, float k) \\r\\n{\\r\\n float res = exp(-k * a) + exp(-k * b);\\r\\n return -log(res) / k;\\r\\n}\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p, float r )\\r\\n{\\r\\n\\treturn length(p) - r;\\r\\n}\\r\\n\\r\\nfloat udBox(vec3 p, vec3 b)\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p, vec2 h)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - h;\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat pow8(float x)\\r\\n{\\r\\n\\tx *= x; // xˆ2\\r\\n\\tx *= x; // xˆ4\\r\\n\\treturn x * x;\\r\\n}\\r\\n\\r\\nfloat length8(vec2 v)\\r\\n{\\r\\n\\treturn pow(pow8(v.x) + pow8(v.y), .125);\\r\\n}\\r\\n// float wheelDistance(Point3 X, Point3 C, float r, float R) {\\r\\n// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R;\\r\\n// }\\r\\n\\r\\nfloat sdTorus82( vec3 p, vec2 t )\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-t.x,p.y);\\r\\n return length8(q)-t.y;\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat sdHexPrism( vec3 p, vec2 h )\\r\\n{\\r\\n vec3 q = abs(p);\\r\\n return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\\r\\n{\\r\\n vec3 pa = p - a, ba = b - a;\\r\\n float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\\r\\n return length( pa - ba*h ) - r;\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat sdEllipsoid( in vec3 p, in vec3 r )\\r\\n{\\r\\n return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\\r\\n}\\r\\n\\r\\nfloat opUnion( float d1, float d2 )\\r\\n{\\r\\n return min(d1, d2);\\r\\n}\\r\\n\\r\\nvec3 opCheapBend( vec3 p, float magnitude)\\r\\n{\\r\\n float c = cos(magnitude * p.y);\\r\\n float s = sin(magnitude * p.y);\\r\\n mat2 m = mat2(c, -s, s, c);\\r\\n vec3 q = vec3( m * p.xy, p.z);\\r\\n return q;\\r\\n}\\r\\n\\r\\nfloat repeatDimension(float x, float m, float extent)\\r\\n{\\r\\n\\treturn mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent));\\r\\n}\\r\\n\\r\\nfloat backgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5));\\r\\n\\tbase = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0));\\r\\n\\tbase = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5)));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat farBackgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat singleTrackSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(20.0, .3, .3));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\r\\n\\tvec3 detailP = point + vec3(0.0, 0.0, -0.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, udBox(detailP, vec3(.075, .3, .1)));\\r\\n\\r\\n\\tdetailP = point + vec3(0.5, .35, -.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\tdetailP = point + vec3(0.75, .35, .3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat clawSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(.65));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1)));\\r\\n\\r\\n\\tpoint += vec3(0.0, 4.45, 0.0);\\r\\n\\tbase = min(base, udBox(point, vec3(.3, .3, .3)));\\r\\n\\r\\n\\tbase = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0));\\r\\n\\tbase = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat tracksSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0));\\t\\r\\n\\r\\n\\t// Neverending claws\\r\\n\\tpoint.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0);\\r\\n\\tbase = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0)));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat railingSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2)));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5)));\\r\\n\\r\\n\\r\\n\\t// Railing bump map ;)\\r\\n\\tvec3 bumpPoint = point + vec3(0.0, 1.15, 0.0);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tbumpPoint = point + vec3(0.25, 1.15, 0.25);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tvec3 columnPoint = point + vec3(3.0, 1.25, -2.5);\\r\\n\\tcolumnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0));\\r\\n\\tcolumnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0));\\r\\n\\r\\n\\tfloat column = udBox(columnPoint, vec3(.35, 50.0, .35));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\r\\n\\tbase = min(base, column);\\r\\n\\r\\n\\tvec3 rep = vec3(1.0, 100.0, 10.0);\\r\\n\\r\\n\\tvec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy;\\r\\n\\tscrewPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5;\\r\\n\\tfloat screws1 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\tscrewPoint.y += 4.25;\\r\\n\\tfloat screws2 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\r\\n\\treturn min(min(base, screws1), screws2);\\r\\n}\\r\\n\\r\\nfloat minionBaseSDF(vec3 point)\\r\\n{\\r\\n\\tvec3 blendOffset = vec3(0.0, 1.5, 0.0);\\r\\n\\tvec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset;\\r\\n\\tvec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset;\\r\\n\\r\\n\\tfloat base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15);\\r\\n\\r\\n\\tfloat hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135);\\r\\n\\tfloat hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135);\\r\\n\\r\\n\\tfloat foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2);\\r\\n\\tfloat foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2);\\r\\n\\r\\n\\tfloat dist = smin(base, hand1, 5.0);\\r\\n\\tdist = smin(dist, hand2, 5.0);\\r\\n\\tdist = smin(dist, foot1, 5.0);\\r\\n\\tdist = smin(dist, foot2, 5.0);\\r\\n\\r\\n\\t// Left Hand\\r\\n\\tbendedPointSym.y -= .15;\\r\\n\\tfloat handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers (note: cylinders would make it better.. but no time!)\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase1);\\r\\n\\r\\n\\t// Right Hand\\r\\n\\tbendedPoint.y -= .15;\\r\\n\\tfloat handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase2);\\r\\n\\r\\n\\tvec3 glassPoint = point - vec3(0.0, 3.0, 1.15);\\t\\r\\n\\tfloat glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1));\\r\\n\\r\\n\\tfloat belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125));\\r\\n\\tbelt = max(belt, -sdSphere(glassPoint, .5));\\r\\n\\tglassBase = min(glassBase, belt);\\r\\n\\tdist = min(dist, glassBase);\\r\\n\\r\\n\\tdist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55));\\r\\n\\r\\n\\tfloat mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0));\\r\\n\\r\\n\\tdist = max(dist, -mouth);\\r\\n\\r\\n\\treturn dist;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\n// TODO: add material types\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial)\\r\\n{\\t\\r\\n\\thitMaterial = 0.0;\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n\\tfloat farBackground = farBackgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, farBackground);\\r\\n\\thitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001));\\r\\n\\r\\n\\tfloat minion = minionBaseSDF(point);\\r\\n\\tminDistance = min(minDistance, minion);\\r\\n\\thitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001));\\r\\n\\r\\n\\tfloat railing = railingSDF(point);\\r\\n\\tminDistance = min(minDistance, railing);\\r\\n\\thitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001));\\r\\n\\r\\n\\tfloat background = backgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, background);\\r\\n\\thitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001));\\r\\n\\t\\r\\n\\tfloat tracks = tracksSDF(point);\\r\\n\\tminDistance = min(minDistance, tracks);\\r\\n\\thitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001));\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\tminDistance = min(minDistance, minionBaseSDF(point));\\r\\n\\tminDistance = min(minDistance, railingSDF(point));\\r\\n\\tminDistance = min(minDistance, backgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, farBackgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, tracksSDF(point));\\r\\n\\treturn minDistance;\\t\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t, float material)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(1.0, 5.0, 7.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5;\\r\\n\\r\\n\\tfloat falloff = 40.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\tfloat facingRatio = dot(-ray.direction, normal);\\r\\n\\r\\n\\tvec4 g = texture2D(gradientMap, vec2((material * .2) + .1, facingRatio));\\r\\n\\r\\n\\tvec3 color = mix(g.rgb, vec3(diffuse), .15);\\r\\n\\r\\n\\treturn color * (shadow * ao * falloff);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n float hitMaterial = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d, hitMaterial);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t, hitMaterial);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/minion.frag.glsl\n// module id = 15\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n\\r\\n#define MAX_GEOMETRY_COUNT 50\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 64\\r\\n#define SECONDARY_ITERATIONS 3\\r\\n#define EPSILON 0.005\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .005\\r\\n\\r\\n#define AO_ITERATIONS 5\\r\\n#define AO_DELTA .1\\r\\n#define AO_DECAY .8\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 24\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .005\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform mat4 u_transforms[MAX_GEOMETRY_COUNT];\\r\\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\\r\\nuniform int u_count;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p )\\r\\n{\\r\\n\\treturn length(p) - 1.0;\\r\\n}\\r\\n\\r\\nfloat udBox( vec3 p)\\r\\n{\\r\\n\\treturn length(max(abs(p) - vec3(.5), 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0);\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform)\\r\\n{\\r\\n\\tvec3 rep = vec3(18.0, 100.0, 18.0);\\r\\n\\tpoint = mod(point + rep * .5, rep) - rep * .5;\\r\\n\\tvec3 localPoint = (transform * vec4(point, 1.0)).xyz;\\r\\n\\r\\n if(geo.w == 0.0)\\r\\n \\treturn udBox(localPoint);\\r\\n\\telse if(geo.w == 1.0)\\r\\n\\t\\treturn sdSphere(localPoint);\\r\\n\\telse if(geo.w == 2.0)\\r\\n\\t\\treturn sdCappedCone(localPoint * .5);\\r\\n\\telse if(geo.w == 3.0)\\r\\n\\t\\treturn sdPlane(localPoint);\\r\\n\\telse if(geo.w == 4.0)\\r\\n\\t\\treturn sdTorus(localPoint);\\r\\n\\telse if(geo.w == 5.0)\\r\\n\\t\\treturn sdCappedCylinder(localPoint);\\r\\n\\r\\n\\treturn FAR_CLIP;\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\r\\n \\tfor (int i = 0; i < MAX_GEOMETRY_COUNT; i++) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n\\r\\n return minDistance;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\\r\\n{\\t\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n \\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * .15, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(0.0, 4.0, 3.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0);\\r\\n\\tfloat shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\treturn vec3(diffuse * falloff * shadow * ao);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/rayMarch-frag.glsl\n// module id = 16\n// module chunks = 0","module.exports = __webpack_public_path__ + \"index.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/file-loader?name=[name].[ext]!./index.html\n// module id = 17\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\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\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 18\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 263f807919bfe1eeb6e5","webpack:///./src/main.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./src/proxy_geometry.js","webpack:///./~/three/build/three.js","webpack:///./src/rayMarching.js","webpack:///./~/three-effectcomposer/index.js","webpack:///./~/three-copyshader/index.js","webpack:///./~/three-effectcomposer/lib/renderpass.js","webpack:///./~/three-effectcomposer/lib/shaderpass.js","webpack:///./~/three-effectcomposer/lib/maskpass.js","webpack:///./~/three-effectcomposer/lib/clearmaskpass.js","webpack:///./src/glsl/pass-vert.glsl","webpack:///./src/glsl/minion.frag.glsl","webpack:///./src/glsl/rayMarch-frag.glsl","webpack:///./index.html","webpack:///./~/three-orbit-controls/index.js"],"names":["require","THREE","OrbitControls","BoxGeometry","SphereGeometry","ConeGeometry","PlaneGeometry","TorusGeometry","Math","PI","CylinderGeometry","Engine","time","deltaTime","clock","window","addEventListener","stats","setMode","domElement","style","position","left","top","document","body","appendChild","scene","Scene","camera","PerspectiveCamera","innerWidth","innerHeight","renderer","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","Clock","controls","enableDamping","enableZoom","rotateSpeed","zoomSpeed","panSpeed","fov","updateProjectionMatrix","aspect","gui","GUI","options","strategy","debug","add","AxisHelper","DirectionalLight","proxyGeometry","boxMesh","Mesh","userData","geoType","sphereMesh","coneMesh","cylinderMesh","planeMesh","torusMesh","g1","Group","rotateX","torusWrapper","set","onBeforeRender","scale","sin","y","x","z","cos","rotateZ","group","target","lookAt","Vector3","rayMarcher","tick","getDelta","cameraTime","update","begin","render","buffer","transforms","end","requestAnimationFrame","ProxyMaterial","MeshLambertMaterial","color","PROXY_BUFFER_SIZE","ProxyGeometry","bounds","_buffer","Float32Array","_transforms","mesh","children","length","computeBuffer","remove","t","i","child","worldToLocal","Matrix4","getInverse","matrixWorld","toArray","RayMarcher","EffectComposer","minionComposer","minionPass","ShaderPass","uniforms","gradientMap","type","value","u_buffer","u_count","u_debug","u_viewProjectionMatrix","u_cameraPosition","u_transforms","vertexShader","fragmentShader","renderToScreen","addPass","composer","shaderPass","txLoader","TextureLoader","load","texture","material","RenderPass","inverseProjectionMatrix","minionScene","updateMatrix","projectionMatrix","matrix","clone","multiply"],"mappings":"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EA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,8BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;;AAEA;;;AAGA,0BAAyB,oCAAoC;AAC7D;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAuB,oCAAoC;AAC3D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA,EAAC;AACD;AACA,SAAQ,gBAAgB,SAAS,UAAU,WAAW,WAAW,OAAO,eAAe,MAAM,OAAO,QAAQ,SAAS,UAAU,mBAAmB,gBAAgB,SAAS,uCAAuC,kCAAkC,oCAAoC,+BAA+B,4BAA4B,gBAAgB,0CAA0C,UAAU,gBAAgB,6BAA6B,iCAAiC,qBAAqB,yDAAyD,UAAU,uBAAuB,uCAAuC,kCAAkC,oCAAoC,+BAA+B,SAAS,kBAAkB,iBAAiB,YAAY,eAAe,kBAAkB,sBAAsB,6BAA6B,sBAAsB,MAAM,YAAY,kBAAkB,kBAAkB,kBAAkB,gBAAgB,yBAAyB,aAAa,gBAAgB,eAAe,MAAM,aAAa,OAAO,wCAAwC,mCAAmC,qCAAqC,gCAAgC,oBAAoB,YAAY,YAAY,iBAAiB,gBAAgB,oBAAoB,cAAc,UAAU,oCAAoC,aAAa,eAAe,iBAAiB,mEAAmE,SAAS,gBAAgB,SAAS,QAAQ,WAAW,iBAAiB,YAAY,mBAAmB,eAAe,WAAW,WAAW,UAAU,gBAAgB,uBAAuB,OAAO,WAAW,UAAU,wBAAwB,SAAS,eAAe,YAAY,WAAW,YAAY,iCAAiC,UAAU,cAAc,YAAY,WAAW,UAAU,iBAAiB,eAAe,YAAY,eAAe,eAAe,YAAY,4BAA4B,eAAe,cAAc,eAAe,sGAAsG,eAAe,cAAc,aAAa,kBAAkB,iBAAiB,gBAAgB,WAAW,0CAA0C,cAAc,gBAAgB,UAAU,wBAAwB,qBAAqB,gBAAgB,aAAa,sBAAsB,YAAY,aAAa,eAAe,iBAAiB,oBAAoB,aAAa,WAAW,8BAA8B,eAAe,SAAS,YAAY,kCAAkC,qBAAqB,cAAc,cAAc,YAAY,kBAAkB,aAAa,kBAAkB,kBAAkB,aAAa,eAAe,iBAAiB,kBAAkB,sBAAsB,YAAY,gBAAgB,uBAAuB,eAAe,sBAAsB,aAAa,IAAI,WAAW,sCAAsC,0BAA0B,4BAA4B,UAAU,mBAAmB,mCAAmC,SAAS,aAAa,kCAAkC,kBAAkB,mBAAmB,oBAAoB,mBAAmB,gCAAgC,gBAAgB,iBAAiB,mBAAmB,SAAS,uBAAuB,gBAAgB,YAAY,wBAAwB,gBAAgB,eAAe,kBAAkB,cAAc,gBAAgB,wBAAwB,mBAAmB,WAAW,4BAA4B,4BAA4B,eAAe,8BAA8B,sCAAsC,mfAAmf,WAAW,UAAU,8BAA8B,yBAAyB,4BAA4B,cAAc,gBAAgB,aAAa,kBAAkB,mCAAmC,wGAAwG,eAAe,8CAA8C,qBAAqB,oCAAoC,qFAAqF,gBAAgB,8BAA8B,iBAAiB,8BAA8B,eAAe,8BAA8B,gCAAgC,cAAc,eAAe,8BAA8B,gCAAgC,cAAc,6CAA6C,gBAAgB,wBAAwB,mBAAmB,aAAa,8BAA8B,mBAAmB,8BAA8B,mBAAmB,WAAW,eAAe,mBAAmB,iBAAiB,kBAAkB,mBAAmB,qBAAqB,mBAAmB,gCAAgC,mBAAmB;AACxvK;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,YAAW;;AAEX,+DAA8D,uCAAuC;;AAErG;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA6B;AAC7B;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,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A,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA,sBAAqB,mGAAmG,aAAa,2CAA2C,mBAAmB,SAAS,KAAK,4BAA4B,YAAY,gBAAg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,6CAA4C;AAC5C,EAAC,4BAA4B;;AAE7B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yBAAwB,0BAA0B;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,sBAAsB;;AAE5D;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B;;;AAG3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC;;AAEvC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;A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EA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA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;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG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A,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;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AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,4CAA2C,OAAO;;AAElD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uDAAsD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AEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,s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A;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAqB,eAAe;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,qBAAqB;;AAEtC;;AAEA;;AAEA,kBAAiB,eAAe;;AAEhC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;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A;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;AACA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,cAAc;;AAE7D,EAAC;;;;;;;;;;;;mBC9x0CuBkB,U;;AAFxB;;AAHA,KAAMrH,QAAQ,mBAAAD,CAAQ,CAAR,CAAd;AACA,KAAMuH,iBAAiB,mBAAAvH,CAAQ,CAAR,EAAgCC,KAAhC,CAAvB;;AAIe,UAASqH,UAAT,CAAoBrF,QAApB,EAA8BN,KAA9B,EAAqCE,MAArC,EAA6C;;AAExD,SAAI2F,iBAAiB,IAAID,cAAJ,CAAmBtF,QAAnB,CAArB;AACA,SAAIwF,aAAa,IAAIF,eAAeG,UAAnB,CAA8B;AAC3CC,mBAAU;AACNC,0BAAa,EAAEC,MAAM,GAAR,EAAaC,OAAO,IAApB,EADP;AAENC,uBAAU;AACNF,uBAAM,KADA;AAENC,wBAAO,IAAIvB,YAAJ;AAFD,cAFJ;AAMNyB,sBAAS;AACLH,uBAAM,GADD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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sCAAqC;AACrC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;AACA,gDAA+C;;AAE/C;;AAEA;;AAEA;;AAEA;AACA,8CAA6C;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 263f807919bfe1eeb6e5","require('file-loader?name=[name].[ext]!../index.html');\r\n\r\nconst THREE = require('three');\r\nconst OrbitControls = require('three-orbit-controls')(THREE)\r\n\r\nimport DAT from 'dat-gui'\r\nimport Stats from 'stats-js'\r\nimport ProxyGeometry, {ProxyMaterial} from './proxy_geometry'\r\nimport RayMarcher from './rayMarching'\r\n\r\nvar BoxGeometry = new THREE.BoxGeometry(1, 1, 1);\r\nvar SphereGeometry = new THREE.SphereGeometry(1, 32, 32);\r\nvar ConeGeometry = new THREE.ConeGeometry(1, 1);\r\nvar PlaneGeometry = new THREE.PlaneGeometry( 100, 100, 1, 1 );\r\nvar TorusGeometry = new THREE.TorusGeometry( 1, .2, 16, 16, Math.PI * 2);\r\nvar CylinderGeometry = new THREE.CylinderGeometry( 1, 1, 2, 16, 17, false );\r\n\r\nvar Engine = \r\n{\r\n time : 0.0,\r\n deltaTime : 0.0,\r\n clock : null,\r\n}\r\n\r\nwindow.addEventListener('load', function() {\r\n var stats = new Stats();\r\n stats.setMode(1);\r\n stats.domElement.style.position = 'absolute';\r\n stats.domElement.style.left = '0px';\r\n stats.domElement.style.top = '0px';\r\n document.body.appendChild(stats.domElement);\r\n\r\n var scene = new THREE.Scene();\r\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\r\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n renderer.setClearColor(0x999999, 1.0);\r\n document.body.appendChild(renderer.domElement);\r\n\r\n Engine.clock = new THREE.Clock();\r\n\r\n var controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.enableZoom = true;\r\n controls.rotateSpeed = 0.3;\r\n controls.zoomSpeed = 1.0;\r\n controls.panSpeed = 2.0;\r\n\r\n camera.fov = 45;\r\n camera.updateProjectionMatrix();\r\n\r\n\r\n window.addEventListener('resize', function() {\r\n camera.aspect = window.innerWidth / window.innerHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(window.innerWidth, window.innerHeight);\r\n });\r\n\r\n var gui = new DAT.GUI();\r\n\r\n var options = {\r\n strategy: 'Banana',\r\n debug : false\r\n }\r\n\r\n gui.add(options, 'strategy', ['Proxy Geometry', 'Ray Marching', 'Banana']);\r\n gui.add(options, 'debug');\r\n\r\n scene.add(new THREE.AxisHelper(20));\r\n scene.add(new THREE.DirectionalLight(0xffffff, 1));\r\n\r\n var proxyGeometry = new ProxyGeometry();\r\n\r\n var boxMesh = new THREE.Mesh(BoxGeometry, ProxyMaterial);\r\n boxMesh.userData = { geoType : 0 }\r\n\r\n var sphereMesh = new THREE.Mesh(SphereGeometry, ProxyMaterial);\r\n sphereMesh.userData = { geoType : 1 }\r\n\r\n var coneMesh = new THREE.Mesh(ConeGeometry, ProxyMaterial);\r\n coneMesh.userData = { geoType : 2}\r\n\r\n var cylinderMesh = new THREE.Mesh(CylinderGeometry, ProxyMaterial);\r\n cylinderMesh.userData = { geoType : 5 }\r\n\r\n var planeMesh = new THREE.Mesh(PlaneGeometry, ProxyMaterial);\r\n var torusMesh = new THREE.Mesh(TorusGeometry, ProxyMaterial);\r\n \r\n // These transformations need to be hidden\r\n var g1 = new THREE.Group();\r\n planeMesh.rotateX(Math.PI * -.5);\r\n g1.add(planeMesh);\r\n g1.userData = { geoType : 3 };\r\n\r\n var torusWrapper = new THREE.Group();\r\n torusMesh.rotateX(Math.PI * -.5);\r\n torusWrapper.add(torusMesh);\r\n torusWrapper.userData = { geoType : 4 };\r\n\r\n g1.position.set(0, -1, 0);\r\n boxMesh.position.set(-3, 0, 0);\r\n coneMesh.position.set(3, 0, 0);\r\n torusWrapper.position.set(0, 0, 4);\r\n cylinderMesh.position.set(4, 1, 4);\r\n\r\n coneMesh.onBeforeRender = function() { \r\n var scale = Math.sin(Engine.time) * .35 + 1\r\n coneMesh.scale.set(scale, scale, scale);\r\n }\r\n\r\n boxMesh.onBeforeRender = function() {\r\n boxMesh.position.y = Math.sin(Engine.time) * 2 + 1;\r\n };\r\n\r\n cylinderMesh.onBeforeRender = function() {\r\n cylinderMesh.position.y = Math.sin(Engine.time + 1.5) + 1;\r\n cylinderMesh.rotateX(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n sphereMesh.onBeforeRender = function() {\r\n sphereMesh.position.x = Math.sin(Engine.time + .5);\r\n sphereMesh.position.z = Math.cos(Engine.time + .5) - .5;\r\n sphereMesh.position.y = Math.sin(Engine.time + 2.3) - .5;\r\n };\r\n\r\n torusMesh.onBeforeRender = function() {\r\n torusWrapper.rotateZ(Engine.deltaTime * Math.PI);\r\n };\r\n\r\n proxyGeometry.add(boxMesh);\r\n proxyGeometry.add(sphereMesh);\r\n proxyGeometry.add(coneMesh);\r\n proxyGeometry.add(g1);\r\n proxyGeometry.add(torusWrapper);\r\n proxyGeometry.add(cylinderMesh);\r\n\r\n scene.add(proxyGeometry.group);\r\n\r\n controls.target.set(0,1.5,0);\r\n\r\n camera.position.set(3, 3.5, 13);\r\n camera.lookAt(new THREE.Vector3(0,0,0));\r\n \r\n var rayMarcher = new RayMarcher(renderer, scene, camera);\r\n\r\n (function tick() {\r\n var deltaTime = Engine.clock.getDelta();\r\n\r\n Engine.time += deltaTime;\r\n Engine.cameraTime += deltaTime;\r\n Engine.deltaTime = deltaTime;\r\n\r\n controls.update();\r\n stats.begin();\r\n proxyGeometry.update();\r\n\r\n if (options.strategy === 'Proxy Geometry') {\r\n renderer.render(scene, camera);\r\n } else if (options.strategy === 'Ray Marching') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, false, Engine.time);\r\n } else if (options.strategy === 'Banana') {\r\n rayMarcher.render(proxyGeometry.buffer, proxyGeometry.transforms, camera, options, true, Engine.time);\r\n }\r\n stats.end();\r\n requestAnimationFrame(tick);\r\n })();\r\n});\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 1\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 2\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\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\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 3\n// module chunks = 0","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 4\n// module chunks = 0","const THREE = require('three');\r\n\r\nexport var ProxyMaterial = new THREE.MeshLambertMaterial({\r\n color: 0xff0000\r\n});\r\n\r\nexport const PROXY_BUFFER_SIZE = 4;\r\n\r\nexport default class ProxyGeometry {\r\n constructor(bounds) {\r\n this.group = new THREE.Group();\r\n this._buffer = new Float32Array();\r\n this._transforms = new Float32Array();\r\n }\r\n\r\n add(mesh) {\r\n this.group.add(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n remove(mesh) {\r\n this.group.remove(mesh);\r\n this._buffer = new Float32Array(PROXY_BUFFER_SIZE * this.group.children.length);\r\n this._transforms = new Float32Array(16 * this.group.children.length);\r\n this.computeBuffer();\r\n }\r\n\r\n update(t = 1/60) {\r\n const {children} = this.group;\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n\r\n // TODO: animate objects\r\n }\r\n this.computeBuffer();\r\n }\r\n\r\n computeBuffer() {\r\n const {children} = this.group;\r\n\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n this._buffer[PROXY_BUFFER_SIZE*i] = child.position.x;\r\n this._buffer[PROXY_BUFFER_SIZE*i+1] = child.position.y;\r\n this._buffer[PROXY_BUFFER_SIZE*i+2] = child.position.z;\r\n\r\n var worldToLocal = new THREE.Matrix4();\r\n worldToLocal.getInverse(child.matrixWorld);\r\n worldToLocal.toArray(this._transforms, i * 16);\r\n\r\n this._buffer[PROXY_BUFFER_SIZE*i+3] = child.userData.geoType;\r\n // if (child.geometry instanceof THREE.BoxGeometry) {\r\n // } else if (child.geometry instanceof THREE.SphereGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 1;\r\n // } else if (child.geometry instanceof THREE.ConeGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 2;\r\n // } else if (child.geometry instanceof THREE.PlaneGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 3;\r\n // } else if (child.geometry instanceof THREE.TorusGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 4;\r\n // } else if (child.geometry instanceof THREE.CylinderGeometry) {\r\n // this._buffer[PROXY_BUFFER_SIZE*i+3] = 5;\r\n // }\r\n }\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n\r\n get transforms()\r\n {\r\n return this._transforms;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/proxy_geometry.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tEventDispatcher.prototype = {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tvar REVISION = '84';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tvar textureId = 0;\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\t\tthis.x = ( m32 - m23 ) / s;\n\t\t\tthis.y = ( m13 - m31 ) / s;\n\t\t\tthis.z = ( m21 - m12 ) / s;\n\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\t\t\tthis.w = attribute.getW( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tWebGLRenderTarget.prototype = {\n\n\t\tconstructor: WebGLRenderTarget,\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\t\t\tvar w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ];\n\n\t\t\treturn this.divideScalar( w );\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCylindrical: function( c ) {\n\n\t\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\t\tthis.y = c.y;\n\t\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeShear: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, y, z, 0,\n\t\t\t\tx, 1, z, 0,\n\t\t\t\tx, y, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tif ( far === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"float 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}\\nvec2 ltcTextureCoords( const in GeometricContext geometry, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = (LUT_SIZE - 1.0)/LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5/LUT_SIZE;\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\\n\\tint config = 0;\\n\\tif ( L[0].z > 0.0 ) config += 1;\\n\\tif ( L[1].z > 0.0 ) config += 2;\\n\\tif ( L[2].z > 0.0 ) config += 4;\\n\\tif ( L[3].z > 0.0 ) config += 8;\\n\\tn = 0;\\n\\tif ( config == 0 ) {\\n\\t} else if ( config == 1 ) {\\n\\t\\tn = 3;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 2 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 3 ) {\\n\\t\\tn = 4;\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t\\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t} else if ( config == 4 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t} else if ( config == 5 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 6 ) {\\n\\t\\tn = 4;\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 7 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\\n\\t\\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\\n\\t} else if ( config == 8 ) {\\n\\t\\tn = 3;\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = L[3];\\n\\t} else if ( config == 9 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t\\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t} else if ( config == 10 ) {\\n\\t\\tn = 0;\\n\\t} else if ( config == 11 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\\n\\t\\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\\n\\t} else if ( config == 12 ) {\\n\\t\\tn = 4;\\n\\t\\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t} else if ( config == 13 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = L[3];\\n\\t\\tL[3] = L[2];\\n\\t\\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\\n\\t\\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\\n\\t} else if ( config == 14 ) {\\n\\t\\tn = 5;\\n\\t\\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\\n\\t\\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\\n\\t} else if ( config == 15 ) {\\n\\t\\tn = 4;\\n\\t}\\n\\tif ( n == 3 )\\n\\t\\tL[3] = L[0];\\n\\tif ( n == 4 )\\n\\t\\tL[4] = L[0];\\n}\\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\\n\\tfloat cosTheta = dot( v1, v2 );\\n\\tfloat theta = acos( cosTheta );\\n\\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\\n\\treturn res;\\n}\\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\\n\\trectPoints[0] = pos - halfWidth - halfHeight;\\n\\trectPoints[1] = pos + halfWidth - halfHeight;\\n\\trectPoints[2] = pos + halfWidth + halfHeight;\\n\\trectPoints[3] = pos - halfWidth + halfHeight;\\n}\\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 P = geometry.position;\\n\\tvec3 T1, T2;\\n\\tT1 = normalize(V - N * dot( V, N ));\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\\n\\tvec3 clippedRect[5];\\n\\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\\n\\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\\n\\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\\n\\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\\n\\tint n;\\n\\tclipQuadToHorizon(clippedRect, n);\\n\\tif ( n == 0 )\\n\\t\\treturn vec3( 0, 0, 0 );\\n\\tclippedRect[0] = normalize( clippedRect[0] );\\n\\tclippedRect[1] = normalize( clippedRect[1] );\\n\\tclippedRect[2] = normalize( clippedRect[2] );\\n\\tclippedRect[3] = normalize( clippedRect[3] );\\n\\tclippedRect[4] = normalize( clippedRect[4] );\\n\\tfloat sum = 0.0;\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\\n\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\\n\\tif (n >= 4)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\\n\\tif (n == 5)\\n\\t\\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\\n\\tsum = max( 0.0, sum );\\n\\tvec3 Lo_i = vec3( sum, sum, sum );\\n\\treturn Lo_i;\\n}\\nvec3 Rect_Area_Light_Specular_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\\n\\t\\tconst in float roughness,\\n\\t\\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tvec2 uv = ltcTextureCoords( geometry, roughness );\\n\\tvec4 brdfLtcApproxParams, t;\\n\\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\\n\\tt = texture2D( ltcMat, uv );\\n\\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\\n\\tmat3 brdfLtcApproxMat = mat3(\\n\\t\\tvec3( 1, 0, t.y ),\\n\\t\\tvec3( 0, t.z, 0 ),\\n\\t\\tvec3( t.w, 0, t.x )\\n\\t);\\n\\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\\n\\tspecularReflectance *= brdfLtcScalar;\\n\\treturn specularReflectance;\\n}\\nvec3 Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\tconst in GeometricContext geometry,\\n\\t\\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\\n\\tvec3 rectPoints[4];\\n\\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\\n\\tmat3 diffuseBrdfMat = mat3(1);\\n\\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\\n\\treturn diffuseReflectance;\\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\";\n\n\tvar 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\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, 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#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\n\tvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\n\tvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar 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};\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\\n\\t}\\n#endif\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 matDiffColor = material.diffuseColor;\\n\\t\\tvec3 matSpecColor = material.specularColor;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 spec = Rect_Area_Light_Specular_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\\n\\t\\t\\t\\troughness,\\n\\t\\t\\t\\tltcMat, ltcMag );\\n\\t\\tvec3 diff = Rect_Area_Light_Diffuse_Reflectance(\\n\\t\\t\\t\\tgeometry,\\n\\t\\t\\t\\trectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\\n\\t\\treflectedLight.directSpecular += lightColor * matSpecColor * spec;\\n\\t\\treflectedLight.directDiffuse += lightColor * matDiffColor * diff;\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar 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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#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\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar 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 ) * flipNormal;\\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\";\n\n\tvar 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\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar 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\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar 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\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar 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\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\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}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar 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\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\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\\t#include \\n}\\n\";\n\n\tvar 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 \\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\\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\";\n\n\tvar 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 \\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\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\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\\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\";\n\n\tvar 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 \\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\";\n\n\tvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\n\tvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\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\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\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#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\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_vertex: fog_vertex,\n\t\tfog_pars_vertex: fog_pars_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\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 ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tgradientmap: {\n\n\t\t\tgradientMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} },\n\n\t\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\t\trectAreaLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\twidth: {},\n\t\t\t\theight: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.gradientmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tscale: { value: 1 },\n\t\t\t\t\tdashSize: { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\t\t\t\tlightPos: { value: new Vector3() }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tShaderLib.standard.uniforms,\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyMatrix4( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( fog.isFog ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar materialId = 0;\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tvar x = attribute.getX( i );\n\t\t\t\tvar y = attribute.getY( i );\n\t\t\t\tvar z = attribute.getZ( i );\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\treturn this.expandByObject( object );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function expandByObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box;\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tif ( box === undefined ) box = new Box3(); // see #10547\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( light && light.isPointLight ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\t// TODO (abelnation / sam-g-steel): is this needed?\n\t\t\t\tif (shadow && shadow.isRectAreaLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material && material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tvar object3DId = 0;\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\n\t\tthis.onBeforeRender = function () {};\n\t\tthis.onAfterRender = function () {};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject3D.prototype = {\n\n\t\tconstructor: Object3D,\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.layers.mask = source.layers.mask;\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\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\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int8Array( array ), itemSize );\n\n\t}\n\n\tInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\n\tfunction Uint8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8Array( array ), itemSize );\n\n\t}\n\n\tUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\n\tfunction Uint8ClampedBufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\n\tfunction Int16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int16Array( array ), itemSize );\n\n\t}\n\n\tInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\n\tfunction Uint16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint16Array( array ), itemSize );\n\n\t}\n\n\tUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\n\tfunction Int32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int32Array( array ), itemSize );\n\n\t}\n\n\tInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\n\tfunction Uint32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint32Array( array ), itemSize );\n\n\t}\n\n\tUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\n\tfunction Float32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float32Array( array ), itemSize );\n\n\t}\n\n\tFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\n\tfunction Float64BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float64Array( array ), itemSize );\n\n\t}\n\n\tFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, {\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex = undefined;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t// http://stackoverflow.com/questions/1669190/javascript-min-max-array-values/13440842#13440842\n\n\tfunction arrayMax( array ) {\n\n\t\tvar length = array.length, max = - Infinity;\n\n\t\twhile ( length -- ) {\n\n\t\t\tif ( array[ length ] > max ) {\n\n\t\t\t\tmax = array[ length ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn max;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tvar count = 0;\n\tfunction GeometryIdCount() { return count++; }\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tGeometry.prototype = {\n\n\t\tconstructor: Geometry,\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( ( geometry && geometry.isGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( ( mesh && mesh.isMesh ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar i, il, j, jl, k, kl;\n\n\t\t\t// reset\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.colors = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [[]];\n\t\t\tthis.morphTargets = [];\n\t\t\tthis.morphNormals = [];\n\t\t\tthis.skinWeights = [];\n\t\t\tthis.skinIndices = [];\n\t\t\tthis.lineDistances = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// vertices\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// face vertex uvs\n\n\t\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargets = source.morphTargets;\n\n\t\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = {};\n\t\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t\t// vertices\n\n\t\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// normals\n\n\t\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t\t// morph normals\n\n\t\t\tvar morphNormals = source.morphNormals;\n\n\t\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphNormal = {};\n\n\t\t\t\t// vertex normals\n\n\t\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// face normals\n\n\t\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t\t}\n\n\t\t\t// skin weights\n\n\t\t\tvar skinWeights = source.skinWeights;\n\n\t\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// skin indices\n\n\t\t\tvar skinIndices = source.skinIndices;\n\n\t\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// line distances\n\n\t\t\tvar lineDistances = source.lineDistances;\n\n\t\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// update flags\n\n\t\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tBufferGeometry.prototype = {\n\n\t\tconstructor: BufferGeometry,\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tif ( Array.isArray( index ) ) {\n\n\t\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tthis.index = index;\n\n\t\t\t}\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh ) {\n\n\t\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar position = this.attributes.position;\n\n\t\t\t\tif ( position ) {\n\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( ( geometry && geometry.isBufferGeometry ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// index\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tvar morphAttributes = source.morphAttributes;\n\n\t\t\tfor ( name in morphAttributes ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// draw range\n\n\t\t\tthis.drawRange.start = source.drawRange.start;\n\t\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uv ) {\n\n\t\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar intersection;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = ( material && material.isMultiMaterial );\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar uvs;\n\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar numberOfVertices = 0;\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth = width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar ix, iy;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar ix, iy;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else if ( index.array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\t\t\t\tsize = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t \n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\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 );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshToonMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( map.isTexture ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tvar type = gl.FLOAT;\n\t\t\tvar array = data.array;\n\n\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\ttype = gl.FLOAT;\n\n\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\ttype = gl.SHORT;\n\n\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\ttype = gl.INT;\n\n\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\ttype = gl.BYTE;\n\n\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t\t}\n\n\t\t\tattributeProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\t\tattributeProperties.type = type;\n\t\t\tattributeProperties.version = data.version;\n\n\t\t\tdata.onUploadCallback();\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\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.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getAttributeProperties( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data );\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute );\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetAttributeProperties: getAttributeProperties,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\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 );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\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 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\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 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar version = parseFloat( /^WebGL\\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );\n\t\tvar lineWidthAvailable = parseFloat( version ) >= 1.0;\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\t\t\tdepthBuffer.setClear( 1 );\n\t\t\tstencilBuffer.setClear( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t\t// internal state cache\n\n\t\t\t_currentProgram = null,\n\t\t\t_currentRenderTarget = null,\n\t\t\t_currentFramebuffer = null,\n\t\t\t_currentMaterialId = - 1,\n\t\t\t_currentGeometryProgram = '',\n\t\t\t_currentCamera = null,\n\n\t\t\t_currentScissor = new Vector4(),\n\t\t\t_currentScissorTest = null,\n\n\t\t\t_currentViewport = new Vector4(),\n\n\t\t\t//\n\n\t\t\t_usedTextureUnits = 0,\n\n\t\t\t//\n\n\t\t\t_clearColor = new Color( 0x000000 ),\n\t\t\t_clearAlpha = 0,\n\n\t\t\t_width = _canvas.width,\n\t\t\t_height = _canvas.height,\n\n\t\t\t_pixelRatio = 1,\n\n\t\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissorTest = false,\n\n\t\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t\t// frustum\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t// clipping\n\n\t\t\t_clipping = new WebGLClipping(),\n\t\t\t_clippingEnabled = false,\n\t\t\t_localClippingEnabled = false,\n\n\t\t\t_sphere = new Sphere(),\n\n\t\t\t// camera matrices cache\n\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_vector3 = new Vector3(),\n\t\t\t_matrix4 = new Matrix4(),\n\t\t\t_matrix42 = new Matrix4(),\n\n\t\t\t// light arrays cache\n\n\t\t\t_lights = {\n\n\t\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\trectArea: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\t\tshadows: []\n\n\t\t\t},\n\n\t\t\t// info\n\n\t\t\t_infoRender = {\n\n\t\t\t\tcalls: 0,\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0,\n\t\t\t\tpoints: 0\n\n\t\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundPlaneCamera, backgroundPlaneMesh;\n\t\tvar backgroundBoxCamera, backgroundBoxMesh;\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\t\tmaterial.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\t\tvar attributeProperties = objects.getAttributeProperties( geometryAttribute );\n\n\t\t\t\t\t\tvar buffer = attributeProperties.__webglBuffer;\n\t\t\t\t\t\tvar type = attributeProperties.type;\n\t\t\t\t\t\tvar bytesPerElement = attributeProperties.bytesPerElement;\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tstate.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tstate.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tif ( backgroundBoxCamera === undefined ) {\n\n\t\t\t\t\tbackgroundBoxCamera = new PerspectiveCamera();\n\n\t\t\t\t\tbackgroundBoxMesh = new Mesh(\n\t\t\t\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\t\tfog: false\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );\n\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tif ( backgroundPlaneCamera === undefined ) {\n\n\t\t\t\t\tbackgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\t\tbackgroundPlaneMesh = new Mesh(\n\t\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t\t! material.isRawShaderMaterial ||\n\t\t\t\tmaterial.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.rectAreaLights.value = _lights.rectArea;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isMeshNormalMaterial ||\n\t\t\t\t\tmaterial.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// RectAreaLight Texture\n\t\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\t\tif ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE;\n\t\t\t\tif ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE;\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t\tif ( material.gradientMap ) {\n\n\t\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\t\tr = 0, g = 0, b = 0,\n\t\t\t\tcolor,\n\t\t\t\tintensity,\n\t\t\t\tdistance,\n\t\t\t\tshadowMap,\n\n\t\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\trectAreaLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\t// (a) intensity controls irradiance of entire light\n\t\t\t\t\tuniforms.color\n\t\t\t\t\t\t.copy( color )\n\t\t\t\t\t\t.multiplyScalar( intensity / ( light.width * light.height ) );\n\n\t\t\t\t\t// (b) intensity controls the radiance per light area\n\t\t\t\t\t// uniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\t\t_matrix42.identity();\n\t\t\t\t\t_matrix4.copy( light.matrixWorld );\n\t\t\t\t\t_matrix4.premultiply( viewMatrix );\n\t\t\t\t\t_matrix42.extractRotation( _matrix4 );\n\n\t\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\t\tuniforms.halfWidth.applyMatrix4( _matrix42 );\n\t\t\t\t\tuniforms.halfHeight.applyMatrix4( _matrix42 );\n\n\t\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\t\t_lights.rectArea[ rectAreaLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.rectArea.length = rectAreaLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t// TODO (sam-g-steel) why aren't we using join\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar i, j, l, o, ol;\n\t\tvar edge = [ 0, 0 ], edges = {}, e;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\t\tvar vertex;\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tvar position, indices, groups;\n\t\t\tvar group, start, count;\n\t\t\tvar index1, index2;\n\n\t\t\tvertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\t\t\t\tindices = geometry.index;\n\t\t\t\tgroups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.count );\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\t\tstart = group.start;\n\t\t\t\t\tcount = group.count;\n\n\t\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices.getX( i + j );\n\t\t\t\t\t\t\tedge[ 1 ] = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge.sort( sortFunction ); // sorting prevents duplicates\n\n\t\t\t\t\t\t\tkey = edge.toString();\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( key in edges ) {\n\n\t\t\t\t\te = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\n\t\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tvar v = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tvar u = j / slices;\n\n\t\t\t\tvar p = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\tvar a = i * sliceCount + j;\n\t\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tvar azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\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\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\t r, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, j;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\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.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // curve to extrude shape along\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( ( font && font.isFont ) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar ix, iy;\n\n\t\tvar index = 0;\n\t\tvar grid = [];\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = iy / heightSegments;\n\n\t\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tvar u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// some helper variables\n\n\t\tvar segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t */\n\n\tfunction ShapeGeometry( shapes, curveSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tcurveSegments = curveSegments || 12;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar groupStart = 0;\n\t\tvar groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tvar i, l, shapeHole;\n\n\t\t\tvar indexOffset = vertices.length / 3;\n\t\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\t\tvar shapeVertices = points.shape;\n\t\t\tvar shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t\t// also check if holes are in the opposite direction\n\n\t\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\t\tvar edge = [ 0, 0 ], edges = {};\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t\t// prepare source geometry\n\n\t\tvar geometry2;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar sourceVertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tkey = edge.toString();\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\tvar e = edges[ key ];\n\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t// custom array sort function\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar index = 0;\n\t\tvar indexOffset = 0;\n\t\tvar indexArray = [];\n\t\tvar halfHeight = height / 2;\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\n\t\t\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, s;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tShapeBufferGeometry: ShapeBufferGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tBoxGeometry: BoxGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = Array.isArray( materials ) ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author takahirox / http://github.com/takahirox\n\t *\n\t * parameters = {\n\t * gradientMap: new THREE.Texture( )\n\t * }\n\t */\n\n\tfunction MeshToonMaterial( parameters ) {\n\n\t\tMeshPhongMaterial.call( this );\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.gradientMap = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\n\tMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\n\tMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\n\tMeshToonMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshToonMaterial: MeshToonMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FileLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FileLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { type: mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMimeType: function ( value ) {\n\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tfunction DataTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( DataTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\t\timage.addEventListener( 'load', function () {\n\n\t\t\t\tCache.add( url, this );\n\n\t\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\t/*\n\t\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t\t}, false );\n\t\t\t*/\n\n\t\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\timage.src = url;\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function ( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function () {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function () {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function ( timeOffset ) {\n\n\t\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function ( timeScale ) {\n\n\t\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function ( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== - 1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function () {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif ( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function () {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0; m !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar BlendingMode = {\n\t\t\t\tNoBlending: NoBlending,\n\t\t\t\tNormalBlending: NormalBlending,\n\t\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\t\tCustomBlending: CustomBlending\n\t\t\t};\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\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.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = null;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tscope.parse( json, onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tvar TextureMapping = {\n\t\t\t\tUVMapping: UVMapping,\n\t\t\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\t\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\t\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\t\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\t\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\t\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\t\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t\t\t};\n\n\t\t\tvar TextureWrapping = {\n\t\t\t\tRepeatWrapping: RepeatWrapping,\n\t\t\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\t\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t\t\t};\n\n\t\t\tvar TextureFilter = {\n\t\t\t\tNearestFilter: NearestFilter,\n\t\t\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\t\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\t\t\tLinearFilter: LinearFilter,\n\t\t\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\t\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t\t\t};\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.' );\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Bezier Curves formulas obtained from\n\t * http://en.wikipedia.org/wiki/Bézier_curve\n\t */\n\n\tfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\tvar t2 = t * t;\n\t\tvar t3 = t * t2;\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t}\n\n\t//\n\n\tfunction QuadraticBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * p;\n\n\t}\n\n\tfunction QuadraticBezierP1( t, p ) {\n\n\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t}\n\n\tfunction QuadraticBezierP2( t, p ) {\n\n\t\treturn t * t * p;\n\n\t}\n\n\tfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\t\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\t\tQuadraticBezierP2( t, p2 );\n\n\t}\n\n\t//\n\n\tfunction CubicBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * k * p;\n\n\t}\n\n\tfunction CubicBezierP1( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn 3 * k * k * t * p;\n\n\t}\n\n\tfunction CubicBezierP2( t, p ) {\n\n\t\treturn 3 * ( 1 - t ) * t * t * p;\n\n\t}\n\n\tfunction CubicBezierP3( t, p ) {\n\n\t\treturn t * t * t * p;\n\n\t}\n\n\tfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\t\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\t\tCubicBezierP3( t, p3 );\n\n\t}\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.CatmullRomCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( isNaN( divisions ) ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\n\n\t\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function ( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\treturn new Vector2(\n\t\t\tCatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),\n\t\t\tCatmullRom( weight, point0.y, point1.y, point2.y, point3.y )\n\t\t);\n\n\t};\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector2(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector2(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\t **/\n\n\tfunction ShapePath() {\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tShapePath.prototype = {\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push( this.currentPath );\n\t\t\tthis.currentPath.moveTo( x, y );\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tthis.currentPath.lineTo( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts ) {\n\n\t\t\tthis.currentPath.splineThru( pts );\n\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\t\toffsetX = 0;\n\t\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [];\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tvar AudioContext = {\n\n\t\tgetContext: function () {\n\n\t\t\tif ( context === undefined ) {\n\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t\t}\n\n\t\t\treturn context;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = AudioContext.getContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction RectAreaLight ( color, intensity, width, height ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.position.set( 0, 1, 0 );\n\t\tthis.updateMatrix();\n\n\t\tthis.width = ( width !== undefined ) ? width : 10;\n\t\tthis.height = ( height !== undefined ) ? height : 10;\n\n\t\t// TODO (abelnation): distance/decay\n\n\t\t// TODO (abelnation): update method for RectAreaLight to update transform to lookat target\n\n\t\t// TODO (abelnation): shadows\n\t\t// this.shadow = new THREE.RectAreaLightShadow( new THREE.PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\t// TODO (abelnation): RectAreaLight update when light shape is changed\n\tRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: RectAreaLight,\n\n\t\tisRectAreaLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\t// this.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.loop = false;\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.buffer;\n\t\t\tsource.loop = this.loop;\n\t\t\tsource.onended = this.onEnded.bind( this );\n\t\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\t\tsource.start( 0, this.startTime );\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.loop = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.loop = this.loop;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tbufferType = Array;\n\t\t\t\tmixFunction = this._select;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:[\\w-]+[\\/:])*)([\\w-]+)?(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?\\.([\\w-]+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ],\n\t\t\t\t\tknownObject = undefined;\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis._loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tAnimationMixer.prototype = {\n\n\t\tconstructor: AnimationMixer,\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function () {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function ( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function () {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function ( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function ( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function ( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function ( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function ( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function () {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function ( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function ( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function ( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function () {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tUniform.prototype.clone = function () {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n\t *\n\t */\n\n\tfunction Cylindrical( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tCylindrical.prototype = {\n\n\t\tconstructor: Cylindrical,\n\n\t\tset: function ( radius, theta, y ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.theta = theta;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.theta = other.theta;\n\t\t\tthis.y = other.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\t\tthis.y = vec3.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = 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} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar color1 = new Color( 0, 0, 1 );\n\t\tvar color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( object && object.isBone ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar boneMatrix = new Matrix4();\n\t\tvar matrixWorldInv = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\t\tfor ( var i = 0, j = 0; i < this.bones.length; i ++ ) {\n\n\t\t\t\tvar bone = this.bones[ i ];\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tj += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t * @author Mugen87 / http://github.com/Mugen87\n\t */\n\n\tfunction RectAreaLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar materialFront = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false\n\t\t} );\n\n\t\tvar materialBack = new MeshBasicMaterial( {\n\t\t\tcolor: light.color,\n\t\t\tfog: false,\n\t\t\twireframe: true\n\t\t} );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 6 * 3 ), 3 ) );\n\n\t\t// shows the \"front\" of the light, e.g. where light comes from\n\n\t\tthis.add( new Mesh( geometry, materialFront ) );\n\n\t\t// shows the \"back\" of the light, which does not emit light\n\n\t\tthis.add( new Mesh( geometry, materialBack ) );\n\n\t\tthis.update();\n\n\t}\n\n\tRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\n\tRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\n\tRectAreaLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\t\tthis.children[ 1 ].geometry.dispose();\n\t\tthis.children[ 1 ].material.dispose();\n\n\t};\n\n\tRectAreaLightHelper.prototype.update = function () {\n\n\t\tvar vector1 = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh1 = this.children[ 0 ];\n\t\t\tvar mesh2 = this.children[ 1 ];\n\n\t\t\tif ( this.light.target ) {\n\n\t\t\t\tvector1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\t\tvar lookVec = vector2.clone().sub( vector1 );\n\t\t\t\tmesh1.lookAt( lookVec );\n\t\t\t\tmesh2.lookAt( lookVec );\n\n\t\t\t}\n\n\t\t\t// update materials\n\n\t\t\tmesh1.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tmesh2.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// calculate new dimensions of the helper\n\n\t\t\tvar hx = this.light.width * 0.5;\n\t\t\tvar hy = this.light.height * 0.5;\n\n\t\t\t// because the buffer attribute is shared over both geometries, we only have to update once\n\n\t\t\tvar position = mesh1.geometry.getAttribute( 'position' );\n\t\t\tvar array = position.array;\n\n\t\t\t// first face\n\n\t\t\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\t\t\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\t\t\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\n\t\t\t// second face\n\n\t\t\tarray[ 9 ] = - hx; array[ 10 ] = hy; array[ 11 ] = 0;\n\t\t\tarray[ 12 ] = - hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\t\t\tarray[ 15 ] = hx; array[ 16 ] = - hy; array[ 17 ] = 0;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction HemisphereLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } );\n\n\t\tvar position = geometry.getAttribute( 'position' );\n\t\tvar colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar color1 = new Color();\n\t\tvar color2 = new Color();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh = this.children[ 0 ];\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tcolor2.copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tsize = size || 10;\n\t\tdivisions = divisions || 10;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = size / divisions;\n\t\tvar halfSize = size / 2;\n\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author Hectate / http://www.github.com/Hectate\n\t */\n\n\tfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\t\tradius = radius || 10;\n\t\tradials = radials || 16;\n\t\tcircles = circles || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar x, z;\n\t\tvar v, i, j, r, color;\n\n\t\t// create the radials\n\n\t\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * radius;\n\t\t\tz = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tr = radius - ( radius / circles * i );\n\n\t\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tPolarGridHelper.prototype = Object.create( LineSegments.prototype );\n\tPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new BufferGeometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar colorFrustum = new Color( 0xffaa00 );\n\t\tvar colorCone = new Color( 0xff0000 );\n\t\tvar colorUp = new Color( 0x00aaff );\n\t\tvar colorTarget = new Color( 0xffffff );\n\t\tvar colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", colorFrustum );\n\t\taddLine( \"n2\", \"n4\", colorFrustum );\n\t\taddLine( \"n4\", \"n3\", colorFrustum );\n\t\taddLine( \"n3\", \"n1\", colorFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", colorFrustum );\n\t\taddLine( \"f2\", \"f4\", colorFrustum );\n\t\taddLine( \"f4\", \"f3\", colorFrustum );\n\t\taddLine( \"f3\", \"f1\", colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", colorFrustum );\n\t\taddLine( \"n2\", \"f2\", colorFrustum );\n\t\taddLine( \"n3\", \"f3\", colorFrustum );\n\t\taddLine( \"n4\", \"f4\", colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", colorCone );\n\t\taddLine( \"p\", \"n2\", colorCone );\n\t\taddLine( \"p\", \"n3\", colorCone );\n\t\taddLine( \"p\", \"n4\", colorCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", colorUp );\n\t\taddLine( \"u2\", \"u3\", colorUp );\n\t\taddLine( \"u3\", \"u1\", colorUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", colorTarget );\n\t\taddLine( \"p\", \"c\", colorCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", colorCross );\n\t\taddLine( \"cn3\", \"cn4\", colorCross );\n\n\t\taddLine( \"cf1\", \"cf2\", colorCross );\n\t\taddLine( \"cf3\", \"cf4\", colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\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 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( object && object.isBox3 ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry;\n\tvar coneGeometry;\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( lineGeometry === undefined ) {\n\n\t\t\tlineGeometry = new BufferGeometry();\n\t\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t];\n\n\t\tvar colors = [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\n\t/*\n\tBased on an optimized c++ solution in\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t - http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tfunction CubicPoly() {\n\n\t\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tfunction init( x0, x1, t0, t1 ) {\n\n\t\t\tc0 = x0;\n\t\t\tc1 = t0;\n\t\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t\t},\n\n\t\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\t\tt1 *= dt1;\n\t\t\t\tt2 *= dt1;\n\n\t\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t\t},\n\n\t\t\tcalc: function ( t ) {\n\n\t\t\t\tvar t2 = t * t;\n\t\t\t\tvar t3 = t2 * t;\n\t\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar tmp = new Vector3();\n\tvar px = new CubicPoly();\n\tvar py = new CubicPoly();\n\tvar pz = new CubicPoly();\n\n\tfunction CatmullRomCurve3( p /* array of Vector3 */ ) {\n\n\t\tthis.points = p || [];\n\t\tthis.closed = false;\n\n\t}\n\n\tCatmullRomCurve3.prototype = Object.create( Curve.prototype );\n\tCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\n\tCatmullRomCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar l = points.length;\n\n\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\tvar point = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tp1 = points[ intPoint % l ];\n\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t}\n\n\t\treturn new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );\n\n\t};\n\n\tfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve3.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\n\tCubicBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector3(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\n\tQuadraticBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector3(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t};\n\n\tfunction LineCurve3( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve3.prototype = Object.create( Curve.prototype );\n\tLineCurve3.prototype.constructor = LineCurve3;\n\n\tLineCurve3.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar vector = new Vector3();\n\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\tvector.multiplyScalar( t );\n\t\tvector.add( this.v1 );\n\n\t\treturn vector;\n\n\t};\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction MeshFaceMaterial( materials ) {\n\n\t\tconsole.warn( 'THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.' );\n\t\treturn new MultiMaterial( materials );\n\n\t}\n\n\tfunction PointCloud( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction Particle( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\treturn new Sprite( material );\n\n\t}\n\n\tfunction ParticleSystem( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction PointCloudMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleBasicMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleSystemMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction Vertex( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\n\t}\n\n\t//\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\treturn new Int8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\treturn new Uint8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\treturn new Int16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\treturn new Uint16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\treturn new Int32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\treturn new Uint32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\treturn new Float64BufferAttribute( array, itemSize );\n\n\t}\n\n\t//\n\n\tCurve.create = function ( construct, getPoint ) {\n\n\t\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\t\tconstruct.prototype = Object.create( Curve.prototype );\n\t\tconstruct.prototype.constructor = construct;\n\t\tconstruct.prototype.getPoint = getPoint;\n\n\t\treturn construct;\n\n\t};\n\n\t//\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction SplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction Spline( points ) {\n\n\t\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\tObject.assign( Spline.prototype, {\n\n\t\tinitFromArray: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t\t},\n\t\tgetControlPointsArray: function ( optionalTarget ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t\t},\n\t\treparametrizeByArcLength: function ( samplingCoef ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\t//\n\tfunction BoundingBoxHelper( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\treturn new BoxHelper( object, color );\n\n\t}\n\n\tfunction EdgesHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\tfunction WireframeHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\t//\n\n\tfunction XHRLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\treturn new FileLoader( manager );\n\n\t}\n\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\treturn new DataTextureLoader( manager );\n\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tLine3.prototype.center = function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t};\n\n\t_Math.random16 = function () {\n\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t};\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\textractPosition: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\n\t\t},\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\n\t\t},\n\t\trotateAxis: function ( v ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\ttranslate: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t\t},\n\t\trotateX: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t\t},\n\t\trotateY: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t\t},\n\t\trotateZ: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t\t},\n\t\trotateByAxis: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t\t},\n\t\tmakeFrustum: function( left, right, bottom, top, near, far ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t\t}\n\n\t} );\n\n\tPlane.prototype.isIntersectionLine = function ( line ) {\n\n\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\treturn this.intersectsLine( line );\n\n\t};\n\n\tQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t};\n\n\tObject.assign( Ray.prototype, {\n\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\n\t\textrude: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tsetEulerFromRotationMatrix: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t\t},\n\t\tapplyProjection: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\t\treturn this.applyMatrix4( m );\n\n\t\t},\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tGeometry.prototype.computeTangents = function () {\n\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t};\n\n\tObject.assign( Object3D.prototype, {\n\n\t\tgetChildByName: function ( name ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\n\t\t},\n\t\trenderDepth: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\n\t\teulerOrder: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\n\t\tobjects: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\n\t\tlength: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\t\treturn this.array.length;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\n\t\taddIndex: function ( index ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\t\tif ( indexOffset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\n\t\t},\n\t\tclearDrawCalls: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\n\t\t},\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t\t},\n\t\tcomputeOffsets: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\n\t\tdynamic: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\n\t\twrapAround: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\t\tmetal: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\n\t\tderivatives: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\n\t\tsupportsFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\t\treturn this.capabilities.vertexTextures;\n\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\n\t\t},\n\t\tinitMaterial: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t\t},\n\t\taddPrePlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t\t},\n\t\taddPostPlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t\t},\n\t\tupdateShadowMap: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.enabled;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.cullFace;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\n\t\tcullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\t\twrapS: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tAudio.prototype.load = function ( file ) {\n\n\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\tvar scope = this;\n\t\tvar audioLoader = new AudioLoader();\n\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\tscope.setBuffer( buffer );\n\n\t\t} );\n\t\treturn this;\n\n\t};\n\n\tAudioAnalyser.prototype.getData = function () {\n\n\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\treturn this.getFrequencyData();\n\n\t};\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector() {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function () {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer() {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.Texture = Texture;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.FileLoader = FileLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.RectAreaLight = RectAreaLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.AudioContext = AudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Cylindrical = Cylindrical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.RectAreaLightHelper = RectAreaLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.PolarGridHelper = PolarGridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.Path = Path;\n\texports.ShapePath = ShapePath;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ShapeBufferGeometry = ShapeBufferGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshToonMaterial = MeshToonMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.Float64BufferAttribute = Float64BufferAttribute;\n\texports.Float32BufferAttribute = Float32BufferAttribute;\n\texports.Uint32BufferAttribute = Uint32BufferAttribute;\n\texports.Int32BufferAttribute = Int32BufferAttribute;\n\texports.Uint16BufferAttribute = Uint16BufferAttribute;\n\texports.Int16BufferAttribute = Int16BufferAttribute;\n\texports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\n\texports.Uint8BufferAttribute = Uint8BufferAttribute;\n\texports.Int8BufferAttribute = Int8BufferAttribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MeshFaceMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Particle;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.Spline = Spline;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.XHRLoader = XHRLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 6\n// module chunks = 0","const THREE = require('three');\r\nconst EffectComposer = require('three-effectcomposer')(THREE)\r\n\r\nimport {PROXY_BUFFER_SIZE} from './proxy_geometry'\r\n\r\nexport default function RayMarcher(renderer, scene, camera) {\r\n\r\n var minionComposer = new EffectComposer(renderer);\r\n var minionPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n gradientMap: { type: \"t\", value: null},\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/minion.frag.glsl')\r\n });\r\n minionPass.renderToScreen = true;\r\n minionComposer.addPass(minionPass);\r\n\r\n var composer = new EffectComposer(renderer);\r\n var shaderPass = new EffectComposer.ShaderPass({\r\n uniforms: {\r\n u_buffer: {\r\n type: '4fv',\r\n value: new Float32Array()\r\n },\r\n u_count: {\r\n type: 'i',\r\n value: 0\r\n },\r\n u_debug: {\r\n type: 'f',\r\n value: 0\r\n },\r\n time: {\r\n type: 'f',\r\n value: 0\r\n },\r\n u_viewProjectionMatrix : {\r\n type: 'm4',\r\n value: new THREE.Matrix4()\r\n },\r\n u_cameraPosition : {\r\n type: 'v3',\r\n value: new THREE.Vector3(0,0,0)\r\n },\r\n u_transforms : {\r\n type: 'm4v',\r\n value: new Float32Array()\r\n }\r\n },\r\n vertexShader: require('./glsl/pass-vert.glsl'),\r\n fragmentShader: require('./glsl/rayMarch-frag.glsl')\r\n });\r\n shaderPass.renderToScreen = true;\r\n\r\n var txLoader = new THREE.TextureLoader();\r\n txLoader.load('./images/gradients.png', function(texture) {\r\n minionPass.material.uniforms.gradientMap.value = texture;\r\n });\r\n\r\n // Adding this composer we force updating the scene transformations\r\n composer.addPass(new EffectComposer.RenderPass(scene, camera));\r\n composer.addPass(shaderPass);\r\n\r\n var inverseProjectionMatrix = new THREE.Matrix4();\r\n\r\n return {\r\n render: function(buffer, transforms, camera, options, minionScene, time) \r\n {\r\n\r\n camera.updateMatrix();\r\n camera.updateProjectionMatrix();\r\n inverseProjectionMatrix.getInverse(camera.projectionMatrix);\r\n\r\n if(minionScene)\r\n {\r\n minionPass.material.uniforms.u_buffer.value = buffer;\r\n minionPass.material.uniforms.u_transforms.value = transforms;\r\n minionPass.material.uniforms.u_count.value = 0;\r\n minionPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n minionPass.material.uniforms.time.value = time;\r\n\r\n minionPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n minionPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n minionComposer.render();\r\n }\r\n else\r\n {\r\n shaderPass.material.uniforms.u_buffer.value = buffer;\r\n shaderPass.material.uniforms.u_transforms.value = transforms;\r\n shaderPass.material.uniforms.u_count.value = buffer.length / PROXY_BUFFER_SIZE;\r\n shaderPass.material.uniforms.u_debug.value = options.debug ? 1.0 : 0.0;\r\n shaderPass.material.uniforms.time.value = time;\r\n\r\n shaderPass.material.uniforms.u_viewProjectionMatrix.value = camera.matrix.clone().multiply(inverseProjectionMatrix);\r\n shaderPass.material.uniforms.u_cameraPosition.value = camera.position.clone();\r\n\r\n composer.render();\r\n } \r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/rayMarching.js","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n var CopyShader = EffectComposer.CopyShader = require('three-copyshader')\n , RenderPass = EffectComposer.RenderPass = require('./lib/renderpass')(THREE)\n , ShaderPass = EffectComposer.ShaderPass = require('./lib/shaderpass')(THREE, EffectComposer)\n , MaskPass = EffectComposer.MaskPass = require('./lib/maskpass')(THREE)\n , ClearMaskPass = EffectComposer.ClearMaskPass = require('./lib/clearmaskpass')(THREE)\n\n function EffectComposer( renderer, renderTarget ) {\n this.renderer = renderer;\n\n if ( renderTarget === undefined ) {\n var width = window.innerWidth || 1;\n var height = window.innerHeight || 1;\n var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\n renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n this.passes = [];\n\n this.copyPass = new ShaderPass( CopyShader );\n };\n\n EffectComposer.prototype = {\n swapBuffers: function() {\n\n var tmp = this.readBuffer;\n this.readBuffer = this.writeBuffer;\n this.writeBuffer = tmp;\n\n },\n\n addPass: function ( pass ) {\n\n this.passes.push( pass );\n\n },\n\n insertPass: function ( pass, index ) {\n\n this.passes.splice( index, 0, pass );\n\n },\n\n render: function ( delta ) {\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n var maskActive = false;\n\n var pass, i, il = this.passes.length;\n\n for ( i = 0; i < il; i ++ ) {\n\n pass = this.passes[ i ];\n\n if ( !pass.enabled ) continue;\n\n pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n if ( pass.needsSwap ) {\n\n if ( maskActive ) {\n\n var context = this.renderer.context;\n\n context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n }\n\n this.swapBuffers();\n\n }\n\n if ( pass instanceof MaskPass ) {\n\n maskActive = true;\n\n } else if ( pass instanceof ClearMaskPass ) {\n\n maskActive = false;\n\n }\n\n }\n\n },\n\n reset: function ( renderTarget ) {\n\n if ( renderTarget === undefined ) {\n\n renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = window.innerWidth;\n renderTarget.height = window.innerHeight;\n\n }\n\n this.renderTarget1 = renderTarget;\n this.renderTarget2 = renderTarget.clone();\n\n this.writeBuffer = this.renderTarget1;\n this.readBuffer = this.renderTarget2;\n\n },\n\n setSize: function ( width, height ) {\n\n var renderTarget = this.renderTarget1.clone();\n\n renderTarget.width = width;\n renderTarget.height = height;\n\n this.reset( renderTarget );\n\n }\n\n };\n\n // shared ortho camera\n\n EffectComposer.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n EffectComposer.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\n EffectComposer.scene = new THREE.Scene();\n EffectComposer.scene.add( EffectComposer.quad );\n\n return EffectComposer\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/index.js\n// module id = 8\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nmodule.exports = {\n uniforms: {\n \"tDiffuse\": { type: \"t\", value: null },\n \"opacity\": { type: \"f\", value: 1.0 }\n },\n vertexShader: [\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vUv = uv;\",\n \"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n \"}\"\n ].join(\"\\n\"),\n fragmentShader: [\n \"uniform float opacity;\",\n\n \"uniform sampler2D tDiffuse;\",\n\n \"varying vec2 vUv;\",\n\n \"void main() {\",\n\n \"vec4 texel = texture2D( tDiffuse, vUv );\",\n \"gl_FragColor = opacity * texel;\",\n\n \"}\"\n ].join(\"\\n\")\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-copyshader/index.js\n// module id = 9\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function RenderPass( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n if (!(this instanceof RenderPass)) return new RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha);\n\n this.scene = scene;\n this.camera = camera;\n\n this.overrideMaterial = overrideMaterial;\n\n this.clearColor = clearColor;\n this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n this.oldClearColor = new THREE.Color();\n this.oldClearAlpha = 1;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n };\n\n RenderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n this.scene.overrideMaterial = this.overrideMaterial;\n\n if ( this.clearColor ) {\n\n this.oldClearColor.copy( renderer.getClearColor() );\n this.oldClearAlpha = renderer.getClearAlpha();\n\n renderer.setClearColor( this.clearColor, this.clearAlpha );\n\n }\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n if ( this.clearColor ) {\n\n renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n }\n\n this.scene.overrideMaterial = null;\n\n }\n\n };\n\n return RenderPass;\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/renderpass.js\n// module id = 10\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE, EffectComposer) {\n function ShaderPass( shader, textureID ) {\n if (!(this instanceof ShaderPass)) return new ShaderPass(shader, textureID);\n\n this.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n this.material = new THREE.ShaderMaterial( {\n\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader\n\n } );\n\n this.renderToScreen = false;\n\n this.enabled = true;\n this.needsSwap = true;\n this.clear = false;\n\n };\n\n ShaderPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n if ( this.uniforms[ this.textureID ] ) {\n\n this.uniforms[ this.textureID ].value = readBuffer;\n\n }\n\n EffectComposer.quad.material = this.material;\n\n if ( this.renderToScreen ) {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera );\n\n } else {\n\n renderer.render( EffectComposer.scene, EffectComposer.camera, writeBuffer, this.clear );\n\n }\n\n }\n\n };\n\n return ShaderPass;\n\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/shaderpass.js\n// module id = 11\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function MaskPass( scene, camera ) {\n if (!(this instanceof MaskPass)) return new MaskPass(scene, camera);\n\n this.scene = scene;\n this.camera = camera;\n\n this.enabled = true;\n this.clear = true;\n this.needsSwap = false;\n\n this.inverse = false;\n };\n\n MaskPass.prototype = {\n\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n var context = renderer.context;\n\n // don't update color or depth\n\n context.colorMask( false, false, false, false );\n context.depthMask( false );\n\n // set up stencil\n\n var writeValue, clearValue;\n\n if ( this.inverse ) {\n\n writeValue = 0;\n clearValue = 1;\n\n } else {\n\n writeValue = 1;\n clearValue = 0;\n\n }\n\n context.enable( context.STENCIL_TEST );\n context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n context.clearStencil( clearValue );\n\n // draw into the stencil buffer\n\n renderer.render( this.scene, this.camera, readBuffer, this.clear );\n renderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n // re-enable update of color and depth\n\n context.colorMask( true, true, true, true );\n context.depthMask( true );\n\n // only render where stencil is set to 1\n\n context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n context.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n }\n\n };\n\n return MaskPass\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/maskpass.js\n// module id = 12\n// module chunks = 0","/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nmodule.exports = function(THREE) {\n function ClearMaskPass() {\n if (!(this instanceof ClearMaskPass)) return new ClearMaskPass(scene, camera);\n this.enabled = true;\n };\n\n ClearMaskPass.prototype = {\n render: function ( renderer, writeBuffer, readBuffer, delta ) {\n var context = renderer.context;\n context.disable( context.STENCIL_TEST );\n }\n };\n\n return ClearMaskPass\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-effectcomposer/lib/clearmaskpass.js\n// module id = 13\n// module chunks = 0","module.exports = \"#define FAR_CLIP 1000.0\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayDir;\\r\\nvarying vec3 f_rayPos;\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nvoid main() {\\r\\n\\tvec2 tmp = vec2(uv.x, uv.y);\\r\\n tmp = (tmp * 2.0) - vec2(1.0);\\r\\n f_ndcP = vec4(tmp, 1.0, 1.0) * FAR_CLIP;\\r\\n f_uv = uv;\\r\\n\\r\\n f_rayDir = normalize(vec3(u_viewProjectionMatrix * f_ndcP) - u_cameraPosition);\\r\\n f_rayPos = u_cameraPosition;\\r\\n\\r\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/pass-vert.glsl\n// module id = 14\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 36\\r\\n#define SECONDARY_ITERATIONS 3\\r\\n#define EPSILON 0.01\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .0075\\r\\n\\r\\n#define AO_ITERATIONS 4\\r\\n#define AO_DELTA .133\\r\\n#define AO_DECAY .8\\r\\n#define AO_INTENSITY .3\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 18\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .01\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nuniform sampler2D gradientMap;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: https://github.com/stackgl/glsl-smooth-min\\r\\nfloat smin(float a, float b, float k) \\r\\n{\\r\\n float res = exp(-k * a) + exp(-k * b);\\r\\n return -log(res) / k;\\r\\n}\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p, float r )\\r\\n{\\r\\n\\treturn length(p) - r;\\r\\n}\\r\\n\\r\\nfloat udBox(vec3 p, vec3 b)\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p, vec2 h)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - h;\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat pow8(float x)\\r\\n{\\r\\n\\tx *= x; // xˆ2\\r\\n\\tx *= x; // xˆ4\\r\\n\\treturn x * x;\\r\\n}\\r\\n\\r\\nfloat length8(vec2 v)\\r\\n{\\r\\n\\treturn pow(pow8(v.x) + pow8(v.y), .125);\\r\\n}\\r\\n// float wheelDistance(Point3 X, Point3 C, float r, float R) {\\r\\n// return length8(Vector2(length(X.xz - C.xz) - r, X.y - C.y)) - R;\\r\\n// }\\r\\n\\r\\nfloat sdTorus82( vec3 p, vec2 t )\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-t.x,p.y);\\r\\n return length8(q)-t.y;\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat sdHexPrism( vec3 p, vec2 h )\\r\\n{\\r\\n vec3 q = abs(p);\\r\\n return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\\r\\n{\\r\\n vec3 pa = p - a, ba = b - a;\\r\\n float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\\r\\n return length( pa - ba*h ) - r;\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat sdEllipsoid( in vec3 p, in vec3 r )\\r\\n{\\r\\n return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\\r\\n}\\r\\n\\r\\nfloat opUnion( float d1, float d2 )\\r\\n{\\r\\n return min(d1, d2);\\r\\n}\\r\\n\\r\\nvec3 opCheapBend( vec3 p, float magnitude)\\r\\n{\\r\\n float c = cos(magnitude * p.y);\\r\\n float s = sin(magnitude * p.y);\\r\\n mat2 m = mat2(c, -s, s, c);\\r\\n vec3 q = vec3( m * p.xy, p.z);\\r\\n return q;\\r\\n}\\r\\n\\r\\nfloat repeatDimension(float x, float m, float extent)\\r\\n{\\r\\n\\treturn mix(x, mod(x + m * .5, m) - m * .5, step(abs(x + m * .5), extent));\\r\\n}\\r\\n\\r\\nfloat backgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 40.0), vec3(100.0, 100.0, 2.5));\\r\\n\\tbase = max(base, -sdSphere(point + vec3(-5.0, 0.0, 40.0), 25.0));\\r\\n\\tbase = min(base, sdTorus82((point + vec3(-5.0, 0.0, 37.0)).xzy, vec2(25.0, 1.5)));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat farBackgroundSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(-5.0, 0.0, 60.0), vec3(100.0, 100.0, 2.5));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat singleTrackSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(20.0, .3, .3));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, .3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, -.3, 0.0), vec3(50.0, .075, .5)));\\r\\n\\r\\n\\tvec3 detailP = point + vec3(0.0, 0.0, -0.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, udBox(detailP, vec3(.075, .3, .1)));\\r\\n\\r\\n\\tdetailP = point + vec3(0.5, .35, -.3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\tdetailP = point + vec3(0.75, .35, .3);\\r\\n\\tdetailP.x = repeatDimension(detailP.x, 1.0, 50.0);\\r\\n\\tbase = min(base, sdSphere(detailP, .1));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat clawSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point, vec3(.65));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.75, 0.0), vec3(.1, 2.5, .1)));\\r\\n\\r\\n\\tpoint += vec3(0.0, 4.45, 0.0);\\r\\n\\tbase = min(base, udBox(point, vec3(.3, .3, .3)));\\r\\n\\r\\n\\tbase = min(base, sdCapsule(point, vec3(-2.0, -1.0, 0.0), vec3(2.0, -1.2, 0.0), 1.0));\\r\\n\\tbase = min(base, sdCappedCone((point - vec3(3.0, -1.2, 0.0)).yxz * .65));\\r\\n\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat tracksSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = singleTrackSDF(point - vec3(0.0, 6.0, -10.0));\\t\\r\\n\\r\\n\\t// Neverending claws\\r\\n\\tpoint.x = repeatDimension(point.x - mod(time, 10.0), 10.0, 30.0);\\r\\n\\tbase = min(base, clawSDF(point - vec3(0.0, 6.0, -10.0)));\\r\\n\\treturn base;\\r\\n}\\r\\n\\r\\nfloat railingSDF(vec3 point)\\r\\n{\\r\\n\\tfloat base = udBox(point + vec3(0.0, 1.25, 0.75), vec3(20.0, .1, 2.5));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, 2.85), vec3(20.0, .1, .2)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.13, -1.4), vec3(20.0, .1, .2)));\\r\\n\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.5, 0.75), vec3(20.0, .2, 2.25)));\\r\\n\\tbase = min(base, udBox(point + vec3(0.0, 1.8, 0.75), vec3(20.0, .1, 2.5)));\\r\\n\\r\\n\\r\\n\\t// Railing bump map ;)\\r\\n\\tvec3 bumpPoint = point + vec3(0.0, 1.15, 0.0);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tbumpPoint = point + vec3(0.25, 1.15, 0.25);\\r\\n\\tbumpPoint.z = repeatDimension(bumpPoint.z + .5, .5, 2.5);\\r\\n\\tbumpPoint.x = repeatDimension(bumpPoint.x, .55, 20.0);\\r\\n\\tbase = smin(base, sdCapsule(bumpPoint, vec3(0.0, 0.0, 0.0), vec3(-.1, 0.0, .1), .015), 30.0);\\r\\n\\r\\n\\tvec3 columnPoint = point + vec3(3.0, 1.25, -2.5);\\r\\n\\tcolumnPoint.x = mix(columnPoint.x, mod(columnPoint.x + 5.0, 10.0) - 5.0, step(abs(columnPoint.x), 25.0));\\r\\n\\tcolumnPoint.z = mix(columnPoint.z, mod(columnPoint.z + 5.0, 10.0) - 5.0, step(abs(columnPoint.z + 10.0), 10.0));\\r\\n\\r\\n\\tfloat column = udBox(columnPoint, vec3(.35, 50.0, .35));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\tcolumn = min(column, udBox(columnPoint + vec3(-.25, 0.0, 0.0), vec3(.1, 50.0, .5)));\\r\\n\\r\\n\\tbase = min(base, column);\\r\\n\\r\\n\\tvec3 rep = vec3(1.0, 100.0, 10.0);\\r\\n\\r\\n\\tvec3 screwPoint = (point + vec3(0.0, 1.05, -1.4)).xzy;\\r\\n\\tscrewPoint.x = repeatDimension(screwPoint.x, 1.0, 20.0);// mod(screwPoint.x + .5, 1.0) - .5;\\r\\n\\tfloat screws1 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\tscrewPoint.y += 4.25;\\r\\n\\tfloat screws2 = sdHexPrism(screwPoint, vec2(.1));\\r\\n\\r\\n\\treturn min(min(base, screws1), screws2);\\r\\n}\\r\\n\\r\\nfloat minionBaseSDF(vec3 point)\\r\\n{\\r\\n\\tvec3 blendOffset = vec3(0.0, 1.5, 0.0);\\r\\n\\tvec3 bendedPoint = opCheapBend(point - blendOffset, .15) + blendOffset;\\r\\n\\tvec3 bendedPointSym = opCheapBend(point - blendOffset, -.15) + blendOffset;\\r\\n\\r\\n\\tfloat base = sdCapsule(point, vec3(0.0, .5, .0), vec3(0.0, 3.5, 0.0), 1.15);\\r\\n\\r\\n\\tfloat hand1 = sdCapsule(bendedPoint, vec3(1.15, 1.25, 0.0), vec3(2.25, .5, 0.0), .135);\\r\\n\\tfloat hand2 = sdCapsule(bendedPointSym, vec3(-1.15, 1.25, 0.0), vec3(-2.25, .5, 0.0), .135);\\r\\n\\r\\n\\tfloat foot1 = sdCapsule(point, vec3(0.45, -1.0, 0.0), vec3(0.35, 0.5, 0.0), .2);\\r\\n\\tfloat foot2 = sdCapsule(point, vec3(-0.45, -1.0, 0.0), vec3(-0.35, 0.5, 0.0), .2);\\r\\n\\r\\n\\tfloat dist = smin(base, hand1, 5.0);\\r\\n\\tdist = smin(dist, hand2, 5.0);\\r\\n\\tdist = smin(dist, foot1, 5.0);\\r\\n\\tdist = smin(dist, foot2, 5.0);\\r\\n\\r\\n\\t// Left Hand\\r\\n\\tbendedPointSym.y -= .15;\\r\\n\\tfloat handBase1 = sdCappedCylinder(bendedPointSym - vec3(1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase1 = smin(handBase1, sdCappedCylinder(bendedPointSym - vec3(1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers (note: cylinders would make it better.. but no time!)\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase1 = smin(handBase1, sdSphere(bendedPointSym - vec3(1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase1);\\r\\n\\r\\n\\t// Right Hand\\r\\n\\tbendedPoint.y -= .15;\\r\\n\\tfloat handBase2 = sdCappedCylinder(bendedPoint - vec3(-1.6, -.45, 0.0), vec2(.2, .05));\\r\\n\\thandBase2 = smin(handBase2, sdCappedCylinder(bendedPoint - vec3(-1.6, -.6, 0.0), vec2(.1, .15)), 7.5);\\r\\n\\r\\n\\t// Base\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -.8, 0.0), .15), 10.0);\\r\\n\\r\\n\\t// Fingers\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.3, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.85, -1.0, -0.1), .135), 20.0);\\r\\n\\thandBase2 = smin(handBase2, sdSphere(bendedPoint - vec3(-1.6, -1.15, -.05), .135), 20.0);\\r\\n\\r\\n\\tdist = min(dist, handBase2);\\r\\n\\r\\n\\tvec3 glassPoint = point - vec3(0.0, 3.0, 1.15);\\t\\r\\n\\tfloat glassBase = sdTorus82(glassPoint.xzy, vec2(.5, .1));\\r\\n\\r\\n\\tfloat belt = sdTorus82(point - vec3(0.0, 3.0, 0.0), vec2(1.1, .125));\\r\\n\\tbelt = max(belt, -sdSphere(glassPoint, .5));\\r\\n\\tglassBase = min(glassBase, belt);\\r\\n\\tdist = min(dist, glassBase);\\r\\n\\r\\n\\tdist = min(dist, sdSphere(glassPoint + vec3(0.0, 0.0, .35), .55));\\r\\n\\r\\n\\tfloat mouth = sdEllipsoid(opCheapBend(point, .25) - vec3(0.8, 1.5, 1.15), vec3(.4, .1, 1.0));\\r\\n\\r\\n\\tdist = max(dist, -mouth);\\r\\n\\r\\n\\treturn dist;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\n// TODO: add material types\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance, out float hitMaterial)\\r\\n{\\t\\r\\n\\thitMaterial = 0.0;\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n\\tfloat farBackground = farBackgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, farBackground);\\r\\n\\thitMaterial = mix(hitMaterial, 0.0, step(abs(farBackground - minDistance), .001));\\r\\n\\r\\n\\tfloat minion = minionBaseSDF(point);\\r\\n\\tminDistance = min(minDistance, minion);\\r\\n\\thitMaterial = mix(hitMaterial, 1.0, step(abs(minion - minDistance), .001));\\r\\n\\r\\n\\tfloat railing = railingSDF(point);\\r\\n\\tminDistance = min(minDistance, railing);\\r\\n\\thitMaterial = mix(hitMaterial, 2.0, step(abs(railing - minDistance), .001));\\r\\n\\r\\n\\tfloat background = backgroundSDF(point);\\r\\n\\tminDistance = min(minDistance, background);\\r\\n\\thitMaterial = mix(hitMaterial, 3.0, step(abs(background - minDistance), .001));\\r\\n\\t\\r\\n\\tfloat tracks = tracksSDF(point);\\r\\n\\tminDistance = min(minDistance, tracks);\\r\\n\\thitMaterial = mix(hitMaterial, 4.0, step(abs(tracks - minDistance), .001));\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\tminDistance = min(minDistance, minionBaseSDF(point));\\r\\n\\tminDistance = min(minDistance, railingSDF(point));\\r\\n\\tminDistance = min(minDistance, backgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, farBackgroundSDF(point));\\r\\n\\tminDistance = min(minDistance, tracksSDF(point));\\r\\n\\treturn minDistance;\\t\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * AO_INTENSITY, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t, float material)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(1.0, 5.0, 7.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0) * .5 + .5;\\r\\n\\r\\n\\tfloat falloff = 40.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat shadow = clamp(evaluateShadows(point + normal * SHADOW_OFFSET, l) + .15, 0.0, 1.0);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\treturn vec3(diffuse * shadow * ao * falloff);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n float hitMaterial = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d, hitMaterial);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t, hitMaterial);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/minion.frag.glsl\n// module id = 15\n// module chunks = 0","module.exports = \"// Note:\\r\\n// As for most of these assignments, this is not intended to be a very optimal approach to this algorithm,\\r\\n// as I try to be as clear as possible for future reference\\r\\n\\r\\n#define MAX_GEOMETRY_COUNT 50\\r\\n#define FAR_CLIP 1000.0\\r\\n#define MAX_ITERATIONS 64\\r\\n#define SECONDARY_ITERATIONS 3\\r\\n#define EPSILON 0.005\\r\\n\\r\\n#define NORMAL_ESTIMATION_EPSILON .005\\r\\n\\r\\n#define AO_ITERATIONS 5\\r\\n#define AO_DELTA .1\\r\\n#define AO_DECAY .8\\r\\n\\r\\n// SHADOW PARAMETERS\\r\\n#define SHADOW_ITERATIONS 24\\r\\n#define SHADOW_SOFT_FACTOR 6.0\\r\\n#define SHADOW_EPSILON 0.00\\r\\n#define SHADOW_OFFSET .005\\r\\n\\r\\nstruct Ray {\\r\\n\\tvec3 position;\\r\\n\\tvec3 direction;\\r\\n};\\r\\n\\r\\nuniform mat4 u_viewProjectionMatrix;\\r\\nuniform vec3 u_cameraPosition;\\r\\n\\r\\nuniform mat4 u_transforms[MAX_GEOMETRY_COUNT];\\r\\nuniform vec4 u_buffer[MAX_GEOMETRY_COUNT];\\r\\nuniform int u_count;\\r\\n\\r\\nuniform float u_debug;\\r\\nuniform float time;\\r\\n\\r\\nvarying vec2 f_uv;\\r\\nvarying vec4 f_ndcP;\\r\\n\\r\\nvarying vec3 f_rayPos;\\r\\nvarying vec3 f_rayDir;\\r\\n\\r\\n// Reference: http://www.iquilezles.org/www/articles/palettes/palettes.htm\\r\\nvec3 palette( float t, vec3 a, vec3 b, vec3 c, vec3 d)\\r\\n{\\r\\n return saturate(a + b * cos(6.28318 * ( c * t + d)));\\r\\n}\\r\\n\\r\\nvec3 debugIterations(float factor)\\r\\n{\\r\\n\\tvec3 a = vec3(0.478, 0.500, 0.500);\\r\\n\\tvec3 b = vec3(0.500);\\r\\n\\tvec3 c = vec3(0.688, 0.748, 0.748);\\r\\n\\tvec3 d = vec3(0.318, 0.588, 0.908);\\r\\n\\r\\n\\treturn palette(factor, a, b, c, d);\\r\\n}\\r\\n\\r\\n// All SDFS from iq, http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\\r\\n// But they are tweaked for their threejs equivalents\\r\\nfloat sdSphere( vec3 p )\\r\\n{\\r\\n\\treturn length(p) - 1.0;\\r\\n}\\r\\n\\r\\nfloat udBox( vec3 p)\\r\\n{\\r\\n\\treturn length(max(abs(p) - vec3(.5), 0.0));\\r\\n}\\r\\n\\r\\n// TODO: build a parabola mixed with a plane to solve the \\r\\n// grazing angle/boundary iteration problem\\r\\nfloat sdPlane( vec3 p)\\r\\n{\\r\\n\\treturn p.y;\\r\\n}\\r\\n\\r\\nfloat sdCappedCylinder( vec3 p)\\r\\n{\\r\\n vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(1.0);\\r\\n return min(max(d.x,d.y),0.0) + length(max(d,0.0));\\r\\n}\\r\\n\\r\\nfloat sdTorus( vec3 p)\\r\\n{\\r\\n vec2 q = vec2(length(p.xz)-1.0,p.y);\\r\\n return length(q) - .2;\\r\\n}\\r\\n\\r\\nfloat udRoundBox( vec3 p, vec3 b, float r )\\r\\n{\\r\\n\\treturn length(max(abs(p) - b, 0.0)) - r;\\r\\n}\\r\\n\\r\\nfloat sdCappedCone( in vec3 p)\\r\\n{\\r\\n\\tp.y -= .25;\\r\\n vec2 q = vec2( length(p.xz), p.y );\\r\\n vec2 v = vec2(0.5773502691896258, -0.5773502691896258);\\r\\n vec2 w = v - q;\\r\\n vec2 vv = vec2( dot(v,v), v.x*v.x );\\r\\n vec2 qv = vec2( dot(v,w), v.x*w.x );\\r\\n vec2 d = max(qv,0.0) * qv / vv;\\r\\n return sqrt(max(dot(w,w) - max(d.x,d.y), .000000001) ) * sign(max(q.y*v.x-q.x*v.y,w.y));\\r\\n}\\r\\n\\r\\nRay getRay(vec3 origin, vec3 dir)\\r\\n{\\r\\n\\tRay ray;\\r\\n\\tray.position = origin;\\r\\n\\tray.direction = dir;\\r\\n\\treturn ray;\\r\\n}\\r\\n\\r\\nfloat evaluateGeometrySDF(vec3 point, vec4 geo, mat4 transform)\\r\\n{\\r\\n\\tvec3 rep = vec3(18.0, 100.0, 18.0);\\r\\n\\tpoint = mod(point + rep * .5, rep) - rep * .5;\\r\\n\\tvec3 localPoint = (transform * vec4(point, 1.0)).xyz;\\r\\n\\r\\n if(geo.w == 0.0)\\r\\n \\treturn udBox(localPoint);\\r\\n\\telse if(geo.w == 1.0)\\r\\n\\t\\treturn sdSphere(localPoint);\\r\\n\\telse if(geo.w == 2.0)\\r\\n\\t\\treturn sdCappedCone(localPoint * .5);\\r\\n\\telse if(geo.w == 3.0)\\r\\n\\t\\treturn sdPlane(localPoint);\\r\\n\\telse if(geo.w == 4.0)\\r\\n\\t\\treturn sdTorus(localPoint);\\r\\n\\telse if(geo.w == 5.0)\\r\\n\\t\\treturn sdCappedCylinder(localPoint);\\r\\n\\r\\n\\treturn FAR_CLIP;\\r\\n}\\r\\n\\r\\n// This method is useful for just the distance\\r\\nfloat evaluateSceneSDFSimple(vec3 point)\\r\\n{\\r\\n\\tfloat minDistance = FAR_CLIP;\\r\\n\\r\\n \\tfor (int i = 0; i < MAX_GEOMETRY_COUNT; i++) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n\\r\\n return minDistance;\\r\\n}\\r\\n\\r\\n// Assumes minDistance was initialized to FAR_CLIP\\r\\nvoid evaluateSceneSDF(vec3 point, out float minDistance)\\r\\n{\\t\\r\\n\\tminDistance = FAR_CLIP;\\r\\n\\r\\n for (int i = 0; i < MAX_GEOMETRY_COUNT; ++i) \\r\\n {\\r\\n if (i >= u_count)\\r\\n break;\\r\\n\\r\\n vec4 geo = u_buffer[i];\\r\\n mat4 transform = u_transforms[i];\\r\\n float d = evaluateGeometrySDF(point, geo, transform);\\r\\n \\r\\n minDistance = min(d, minDistance);\\r\\n }\\r\\n}\\r\\n\\r\\nvec3 estimateSceneGradient(vec3 point, float epsilon)\\r\\n{\\r\\n\\tfloat x = evaluateSceneSDFSimple(vec3(point.x + epsilon, point.y, point.z));\\r\\n\\tx -= evaluateSceneSDFSimple(vec3(point.x - epsilon, point.y, point.z));\\r\\n\\r\\n\\tfloat y = evaluateSceneSDFSimple(vec3(point.x, point.y + epsilon, point.z));\\r\\n\\ty -= evaluateSceneSDFSimple(vec3(point.x, point.y - epsilon, point.z));\\r\\n\\r\\n\\tfloat z = evaluateSceneSDFSimple(vec3(point.x, point.y, point.z + epsilon));\\r\\n\\tz -= evaluateSceneSDFSimple(vec3(point.x, point.y, point.z - epsilon));\\r\\n\\r\\n\\treturn normalize(vec3(x,y,z));\\r\\n}\\r\\n\\r\\n// For reference, http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm\\r\\n// with tweaks\\r\\nfloat evaluateShadows(vec3 origin, vec3 toLight)\\r\\n{\\r\\n\\tvec3 direction = toLight;\\r\\n\\tfloat maxDistance = length(direction);\\r\\n\\tdirection /= maxDistance;\\r\\n\\r\\n float t = SHADOW_EPSILON;\\r\\n float soft = .5;\\r\\n\\r\\n // WebGL doesnt like loops that cannot be easily unrolled\\r\\n\\tfor(int i = 0; i < SHADOW_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = min(evaluateSceneSDFSimple(origin + direction * t), maxDistance);\\r\\n\\r\\n\\t\\tif(d < SHADOW_EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tsoft = min(soft, SHADOW_SOFT_FACTOR * (d / t));\\r\\n\\r\\n\\t\\tif(t >= maxDistance)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t}\\r\\n\\r\\n\\tsoft = clamp(soft * 2.0, 0.0, 1.0);\\r\\n\\r\\n\\t// This is a mix of soft shadows and a fake AO\\r\\n\\treturn soft + clamp(t * .1, 0.0, 1.0) * (1.0 - soft);\\r\\n}\\r\\n\\r\\nfloat evaluateAmbientOcclusion(vec3 point, vec3 normal)\\r\\n{\\r\\n\\tfloat ao = 0.0;\\r\\n\\tfloat delta = AO_DELTA;\\r\\n\\tfloat decay = 1.0;\\r\\n\\r\\n\\tfor(int i = 0; i < AO_ITERATIONS; i++)\\r\\n\\t{\\r\\n\\t\\tfloat d = float(i) * delta;\\r\\n\\t\\tdecay *= AO_DECAY;\\r\\n\\t\\tao += (d - evaluateSceneSDFSimple(point + normal * d)) / decay;\\r\\n\\t}\\r\\n\\r\\n\\treturn clamp(1.0 - ao * .15, 0.0, 1.0);\\r\\n}\\r\\n\\r\\nvec3 shade(vec3 point, Ray ray, float t)\\r\\n{\\r\\n\\tvec3 normal = estimateSceneGradient(point, NORMAL_ESTIMATION_EPSILON );\\r\\n\\r\\n\\tvec3 light = vec3(0.0, 4.0, 3.0);\\r\\n\\tvec3 l = light - point;\\r\\n\\r\\n\\tfloat falloff = 15.0 / pow(length(l) + EPSILON, 2.0);\\r\\n\\tfloat diffuse = clamp(dot(normal, normalize(l)), 0.0, 1.0);\\r\\n\\tfloat shadow = evaluateShadows(point + normal * SHADOW_OFFSET, l);\\r\\n\\r\\n\\tfloat ao = evaluateAmbientOcclusion(point, normal);\\r\\n\\r\\n\\treturn vec3(diffuse * falloff * shadow * ao);\\r\\n}\\r\\n\\r\\nvoid main() \\r\\n{\\r\\n\\t// Renormalize due to interpolation\\r\\n\\tRay ray = getRay(f_rayPos, normalize(f_rayDir));\\r\\n\\r\\n vec3 color;\\r\\n vec3 current = ray.position;\\r\\n\\r\\n float t = 0.0;\\r\\n\\tfloat d = FAR_CLIP;\\r\\n float iterationCount = 0.0;\\r\\n\\r\\n\\tfor(int j = 0; j < MAX_ITERATIONS; j++)\\r\\n\\t{\\r\\n\\t\\tevaluateSceneSDF(current, d);\\r\\n\\r\\n\\t\\tif(d < EPSILON)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\t}\\r\\n\\r\\n\\t// More details in intersections (similar to a discontinuity reduction)\\r\\n\\t// This GREATLY improves, for example, the gradient estimation for \\r\\n\\t// big discontinuities such as box edges\\r\\n\\tfor(int k = 0; k < SECONDARY_ITERATIONS; k++)\\r\\n\\t{\\r\\n\\t\\tif(t >= FAR_CLIP)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\td = evaluateSceneSDFSimple(current);\\r\\n\\t\\t\\r\\n\\t\\tif(d <= 0.0)\\r\\n\\t\\t\\tbreak;\\r\\n\\r\\n\\t\\tt += d;\\r\\n\\t\\tcurrent += ray.direction * d;\\r\\n\\t\\titerationCount += 1.0;\\r\\n\\t}\\r\\n\\r\\n\\tcolor = shade(current, ray, t);\\r\\n\\r\\n\\t// Gamma correction\\r\\n\\tcolor = pow(color, vec3(.45454));\\r\\n\\r\\n\\tvec3 debugColor = debugIterations(iterationCount / float(MAX_ITERATIONS + SECONDARY_ITERATIONS));\\r\\n\\tcolor = mix(color, debugColor, u_debug);\\r\\n\\r\\n gl_FragColor = vec4(color, 1.0);\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glsl/rayMarch-frag.glsl\n// module id = 16\n// module chunks = 0","module.exports = __webpack_public_path__ + \"index.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/file-loader?name=[name].[ext]!./index.html\n// module id = 17\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\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\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 18\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file From 523581229d7b35882b5eb984dfe79c535095c0ae Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sat, 25 Mar 2017 00:57:08 -0400 Subject: [PATCH 21/26] Update README.md --- README.md | 73 +++---------------------------------------------------- 1 file changed, 3 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 27b5336..3dfe51c 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,5 @@ -# HW 6: Ray marching and SDFs +# Raymarching fun! -## Goal -In this assignment, you will be implementing SDF operators on various primitives and use a ray marcher to render them. Ray marching is a technique for rendering implicit surfaces where the ray-primitive intersection equation cannot be solved analytically. +A small raymarched scene using three.JS and WebGL. -**Warning**: this assignment diverges significantly from marching cubes, so switching options midway can be costly for your time and effort. - -## Base code framework - -We have provided a preview scene, and a toggle for the ray marcher rendering. When you correctly implement the ray marcher, the image should match the preview scene containing the simple geometry. Your ray marching calculation should be performed in the fragment shader. - -### Ray Marcher (25 pts) - -The ray marcher should generate a ray direction, and march through the scene using the distances computed from sphere tracing. - -**Note**: Your scene won't be rendered until you have implemented the SDFs for primitives below. - -- Generate Rays (15 pts): for each fragment inside the fragment shader, compute a ray direction for the ray marcher -- Sphere Tracing (10 pts): compute the nearest distance from the scene SDFs and update the ray marching's step size. - -### SDF (50 pts) -##### Implement primitive SDFs (15pts): -These are simple primitives with well-defined SDFs. We encourage trying other SDFs not listed here, they are interesting! - - Sphere (3pts) - - Box (3pts) - - Cone (3pts) - - Torus (3pts) - - Cylinder (3pts) - -##### Useful Operators (15pts) -To create constructive geometry, and interesting shapes (such as holes, bumps, etc.), implement the following operators to combine your primitive SDFs. - - Intersection (2pts) - - Subtraction (3pts) - - Union (2pts) - - Transformation (8pts) - - translation and scaling -##### Compute normals based on gradient (15 pts) - -Compute the normals to use for shading your surface. -- Read Chapter 13 of [Morgan McGuire's notes](http://graphics.cs.williams.edu/courses/cs371/f14/reading/implicit.pdf) -##### Material (5pts) -Implement a simple Lambert material. Additional materials can earn extra points. - -### Custom Scene (25 pts) -##### Create a mechanical device or a scene of your choice using all operators - - intersection, subtraction, union, transformation (20pts) -##### Animate the scene (5pts) -Use time as an input to some of your functions to animate your scene! - -## Extra credits (Up to 30 pts) -- Implement SDF for [Mandelbulb](https://www.shadertoy.com/view/XsXXWS) (10pts) - - You need to implement naive raymarching (not sphere tracing) to get this to work -- Lighting effects - - Soft shadowing using secondary rays (5pts) - - Ambient occlusion (10pts) -- Additional materials besides Lambert. (5pts each) -- Additional SDFs besides the listed primitive. (5pts each) - -## Resources -http://graphics.cs.williams.edu/courses/cs371/f14/reading/implicit.pdf - -## Submission -- Update `README.md` to contain a solid description of your project -- Publish your project to gh-pages. `npm run deploy`. It should now be visible at http://username.github.io/repo-name -- Create a [pull request](https://help.github.com/articles/creating-a-pull-request/) to this repository, and in the comment, include a link to your published project. -- Submit the link to your pull request on Canvas. - -## Deploy -- `npm run build` -- Add and commit all changes -- `npm run deploy` -- If you're having problems with assets not linking correctly, make sure you wrap you're filepaths in `require()`. This will make the bundler package and your static assets as well. So, instead of `loadTexture('./images/thing.bmp')`, do `loadTexture(require('./images/thing.bmp'))`. \ No newline at end of file +[Watch it here!](https://mmerchante.github.io/raymarching-fun/) From 7d3dcef21ee490ff71dc0cc715a1e0d75e3f043e Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sat, 25 Mar 2017 00:58:10 -0400 Subject: [PATCH 22/26] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3dfe51c..ec0c128 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ A small raymarched scene using three.JS and WebGL. -[Watch it here!](https://mmerchante.github.io/raymarching-fun/) +## [REALTIME](https://mmerchante.github.io/raymarching-fun/) From eb0ecb7fab8bd568cf1b3d4b289231473f24c9c8 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sat, 25 Mar 2017 00:58:32 -0400 Subject: [PATCH 23/26] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec0c128..1dadd4b 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ A small raymarched scene using three.JS and WebGL. -## [REALTIME](https://mmerchante.github.io/raymarching-fun/) +## [Try it!](https://mmerchante.github.io/raymarching-fun/) From 38881ebb7166d2a5e77e1fc374966f87e3d2b6f9 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sat, 25 Mar 2017 00:59:13 -0400 Subject: [PATCH 24/26] * Minion! --- images/minion.png | Bin 0 -> 230731 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/minion.png diff --git a/images/minion.png b/images/minion.png new file mode 100644 index 0000000000000000000000000000000000000000..8139d21e61294b8c486569776f2f9b65b7539930 GIT binary patch literal 230731 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 literal 0 HcmV?d00001 From 22628e9320259119a2bdf894005cfee038e1032f Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sat, 25 Mar 2017 01:00:41 -0400 Subject: [PATCH 25/26] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1dadd4b..bd3cb78 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,6 @@ A small raymarched scene using three.JS and WebGL. ## [Try it!](https://mmerchante.github.io/raymarching-fun/) + + +![Banana!](/images/minion.png?raw=true "") From ae16c42216493340b3661c2ab316450d274fbb42 Mon Sep 17 00:00:00 2001 From: Mariano Merchante Date: Sat, 25 Mar 2017 01:08:13 -0400 Subject: [PATCH 26/26] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bd3cb78..89da852 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ A small raymarched scene using three.JS and WebGL. +This was done as an assignment for a procedural graphics class I took at the University of Pennsylvania. + ## [Try it!](https://mmerchante.github.io/raymarching-fun/)

2fshYvM} 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%0DlD=J|aDz0#}j@ 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 Ymdw1X`Vjcd8e@E&?1ge|p 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

2fshYvM} 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%0DlD=J|aDz0#}j@ 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 Ymdw1X`Vjcd8e@E&?1ge|p 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